2009-08-21 8 views
15

Bunun ile başladı:Bash kullanarak bir dizindeki her dosyaya nasıl bir şey yapılır?

command * 

Ama dizin boş olduğunda çalışmaz; * joker karaktere bir "*" karakter olur. Bu nedenle, bu dizin boşsa, ancak yine de değil,

'a geçtim. Ls:

'u kullanmamaya başvurdum ama tabi ki, boşluktaki dosya adları bölünüyor. Sadece başında tırnak karakteri ile, isimleri neden

for i in `ls -AQ` 

hala bölünmesi ve adının bitiş: Ben -Q anahtarı orsalayarak çalıştı. Burada bariz bir şeyi mi özlüyorum, yoksa olması gerekenden daha mı zor?

for i in * 
do 
    if test -f "$i" 
    then 
     echo "Doing somthing to $i" 
    fi 
done 

Gerçekten hep bu tür testleri yapmalıdır neredeyse kesinlikle istemiyoruz, çünkü: Yalnızca dosyalara bir şey yapmak istiyorum varsayarsak

+0

Aptal Windows dosya isimleri .txt! Bunun için dövülmüş (aşağıya doğru oy) alacağım ama ...komut dosyası ile ilgili iş arkadaşlarına tavsiyem: komut dosyanız "if" veya "while" olduğunda, "kabuk" bir kenara koyup "perl" almanın zamanı geldi :-(Eminim bunu yapmak için biraz mazoşistik bir yol var Bu arada, Bombe'nin bul -exec çözümünün derinliği sınırlaması gerekiyor, bu yüzden alt dizinler de alınıyor. – Roboprog

cevap

35

, basit bir çözüm $ i bir dosya olup olmadığını test etmektir Dosya ve dizinleri aynı şekilde işlemek için. Boşluk içeren dosya isimleriyle ilgili sorunları önleyen "$ i" etrafındaki alıntılara dikkat edin.

+1

Bu en basit cevap gibi görünüyor. Çok fazla kabuk betiği kılavuzunun her zaman size söylediği garip * kullanmak, ancak CWD'de hiçbir dosya olmadığında literal "*" davranışından bahsetme. –

11

find ne istediğinizi olabilir. Böyle

find . | while read file; do 
    # do something with $file 
done 

Ya da belki:

find . -exec <command> {} \; 

Eğer bulmak komutuna -type f ve -maxdepth 1 bir arada eklemeniz gerekebilir alt dizinleri dahil etmek aramayı istemiyorsanız

. Detaylar için find man page'a bakın.

+4

Bir dizinde 10.000'den fazla dosya olduğunda kırılmama ek avantajı – MSalters

+0

@MSalters Bu kadar çok kim var? son kez bir bölünmüş programın bayt beklediğini ve bölünmüş dosyaların sayısını beklemediğimde oldu ... –

+2

Her zaman düşündüğünüzden daha sık oluyor. – Bombe

2

bu hile yapmak gerekir:

find -type d -print0 | xargs -n 1 -0 echo "your folder: {} !" 
find -type f -print0 | xargs -n 1 -0 echo "your file: {} !" 

/0 boşluk ile sorunları önlemek için vardır print0 Bu komutu bir komut satırına aşağıdakini yazın gidiyor ve hangi olmanıza bağlıdır

+1

bul -type d -exec'i kullanarak gerçekten daha iyi Eko "klasörünüz: {}" \; ... xargs, yolunuz çok derinse sorunlarla karşılaşır. –

8

dosyalara uyguluyorsun.

Eğer yazılırsa ikinci seçeneğinizle devam edebilir ve komut için zararsız bir şey kullanabilirsiniz. Örneğin, mv veya rm yerine echo kullanmayı severim. O çalıştığında

for i in * ; do command $i; done 

- veya burada başarısız görebilirsiniz ve zararsız olsun, eğer yukarı ok tuşuna komutu düzenleyip yeniden deneyebilirsiniz:

tek satırda hepsini koyun.

5

Kullanım shopt genişlemesini önlemek için * boşluklu

shopt -s nullglob 
for myfile in *.txt 
do 
    # your code here 
    echo $myfile 

done