Bu xargs komutu neden çalışmıyor?


14

Tüm .sh uzantılarını silmek istedim, bunu yaptım:

ls *.sh | xargs -I {} mv {} `basename {} .sh`

Ancak çalışmaz, basenamedeğişmeyen dosya adı döndürür.

Neden böyle davranıyor?

Örneğin, bu işe yarar:

ls *.sh | xargs -I {} echo `basename {}.jpg .jpg`;

DÜZENLE :

Çözüm: tek tırnak `basename ...`, komut çalıştırılmadan önce kabuğun değerlendirmesini önler .

ls *.sh | xargs -I {}  sh -c 'mv {} `basename {} .sh`'

Yanıtlar:


12

Çünkü taban çizgisi komutu, ardışık düzen çalıştırılmadan önce çalıştırılır. Bu işi yapmak için, basename'i yürütmek için xargs'a ihtiyacınız var ve bunu aşağıdakilerle yapabilirsiniz sh -c, örneğin:

ls *.sh | xargs -L1 sh -c 'basename $1 .sh' dummy

Notlar:

  • xargsDosya adlarının nereye ekleneceğini söylemezseniz , komut satırının sonuna eklenirler.
  • Sen kullanmalısınız -L1nedenle, anahtarı veya eşdeğerini xargssadece bir argüman geçirir sh.
  • Çıktısını kullanmanın istenmeyen etkilerils olabilir .

Düzenle

Kullanımdan kaldırılan seçenekler kaldırıldı, teşekkürler TechZilla


3
-iSeçenekle ilgili varsayılan olarak belirtilmedikçe , ancak bu 'klasik' seçenekler kullanımdan kaldırılmadığı sürece ilk noktanız yanlıştır . Örneğin, yalnızca bir seçenek / satır kullanmak için yeni POSIX kılavuz sayfası önerilir -L1. Eski davranışını çağırmak için -isayfa -I'{}'seçeneği önerir .
JM Becker

Yani aslında '' yerine '' sembolleri ile ilgili. Sanırım 'kabuk değerlendirmesini önler' '. Düzenlemelerimi görün.
majkinetor

@TechZilla: düzeltmeler için teşekkürler. @majkinetor: evet ve hayır, değerlendirmeyi ertelemeniz gerekiyor, ancak backticks kullanabileceğinizi sanmıyorum (`).
Thor

1
@majkinetor: ah, şimdi ne demek istediğini anlıyorum. Dosyaları bu şekilde yeniden adlandırmak için rename, örneğin kullanmak istiyorum rename 's/\.sh//' *.sh. Önce kuru çalışma ( -n) ile deneyin .
Thor

1
@majkinetor: renameharika ve oldukça basit çalışıyor, ancak dağıtımına özgü olduğunu unutmayın. RHEL ve Debian tabanlı dağıtımlar farklı renamekomutlar sağlar, bu nedenle çapraz dağıtım komut dosyaları oluştururken bunu akılda tutmak gerekir.
JM Becker

4

Sorunuzdan emin değilim, aslında ilk hattınızın neden çalışmadığını mı soruyorsunuz? Yoksa tüm .sh dosyalarını yeniden adlandırmak için uygun bir yöntem mi arıyorsunuz?

En temiz yöntem olduğunu varsayarak, daha önce komut seçenekleri hazırlamayı tercih ederim xargs. Bir .sh dosya uzantısını kaldırmak için, genellikle bu yaklaşımı,

 find -maxdepth 1 -type f -iname '*.sh'  | sed 'p;s_.sh$__' | xargs -L2 mv
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.