2013-02-25 8 views

cevap

97

dosyaları üzerinde döngü için daha iyi bir yolu şudur:

find . -type f -iname "*.txt" -print0 | while IFS= read -r -d $'\0' line; do 
    echo "$line" 
    ls -l "$line"  
done 
+9

+1 Bu sadece daha iyi değil, doğru. – chepner

+0

Bu parçacığı içeren komut dosyası bir cronjob @reboot içinde çağrıldığında bunu çalışmasıyla ilgili sorun yaşıyorum. Okuma komutunun -d bayrağı hakkında şikâyet eder ve daha sonra yürütme başarısız olur. Aksi halde harika çalışıyor. –

+8

Başta çalışır, değil sh. – Antzi

5

kullanın command substitution alırım komutunu komut dizisi olarak geçirmek yerine bulmak için:

for line in $(find . -iname '*.txt'); do 
    echo $line 
    ls -l $line; 
done 
+1

eğer "Tek dosya" adlı bir dosyanız var, bu döngüde iki satırda "satır" elde edeceksiniz. Bir "dosya" için başka bir "bekar". – gcb

18

for -loop sağlanan dizede her (boşluk ayrılmış) girişi üzerinde yinelemeli olacaktır.

Gerçekte find komutunu çalıştırmazsınız, ancak bu dizeyi (for -loop tarafından yinelenen) dize olarak sağlayın. Bunun yerine çift tırnak ya komutu ters tırnak veya $() kullanımı: Dosya yollar/adları boşluk içeriyorsa

for line in $(find . -iname '*.txt'); do 
    echo "$line" 
    ls -l "$line" 
done 

Ayrıca, bu yöntem, (boşluk ayrılmış girdileri üzerinde for -loop dolaşır çünkü) başarısız olur. Bunun yerine, dogbanes answer'da açıklanan yöntemi kullanmak daha iyidir.

deyişiyle, tüm uzay ayrılmış girdileri üzerinde for line in "find . -iname '*.txt'"; yinelenir::

  • bulmak

    hatanızı netleştirmek için.
  • -iname
  • '* .txt' (Bence ...)

ilk iki (istenmeyen davranışın yanı sıra) bir hataya yol yok, ama o yürütür gibi üçüncü problemlidir :

ls -l -iname 

tek karakter seçenekleri birleştirebilirsiniz (bash) komutları bir sürü, bu yüzden -iname-i -n -a -m -e aynıdır. Ve voila: senin invalid option -- 'e' hata! dosya adlarında boşluk ve yeni satır kolları olarak burada

+9

Adda boşluklar varsa, for döngüsünün yinelediği listede iki ayrı giriş olarak görünecektir. – chepner

12

dosya adında boşluk ve yeni satır ile çalışan kompakt versiyonu daha fazlası:

find . -iname '*.txt' -exec sh -c 'echo "{}" ; ls -l "{}"' \; 
+0

Bu cevap çok daha basittir ve hem Bash hem de daha basittir sh (Ash) kabukları. – Alkaline

İlgili konular