2010-01-18 28 views
35

find komutunu kullanarak dosya adlarının bir listesini saklamak için bir dizi kullanmaya çalışıyorum.Bir bash komut dosyasında bulmanın sonuçlarını nasıl işleyebilirim?

Bazı nedenlerden dolayı okulun kullandığı bash'ta dizisi çalışmaz, programım kendi dizüstü bilgisayarımda çalışıyor.

array = (`find . -name "*.txt"`) #this will store all the .txt files into the array 

Sonra dizi öğelere erişmek ve kedi komutunu kullanarak tüm dosyaların bir kopyasını yapabilirsiniz: bunu yapmak için başka bir yol varsa

diye merak ediyordum, bu i ne var.

Dizi kullanmadan bunu yapmanın başka bir yolu var mı?

find . -name '*.txt' | while read line; do 
    echo "Processing file '$line'" 
done 

Ör:

cevap

75

Böyle bir şey kullanabilirsiniz Bir kopyasını:

find . -name '*.txt' | while read line; do 
    echo "Copying '$line' to /tmp" 
    cp -- "$line" /tmp 
done 

HTH

+0

çok teşekkürler! işe yaradı ve yeni bir şey öğrendim – Shellscriptbeginner

+0

'for' döngüsünü kullanmak kesinlikle burada daha iyi bir seçimdir. Bir diziyi kullanmak, tüm listeyi bir değişkene okuyup, değişkenin üzerinde yinelemesi dışında çalışır. Bu sürüm, her dosya adını 'bul' kelimesinden geldiği gibi okur ve satır içi olarak işler. –

+0

D.Shawley, lütfen bir for döngüsü olan bir örnek gönderir misiniz? Adında da boşluk bulunan dosyalar için çalışmalı, bence. –

2
find . -name '*.txt' | while IFS= read -r FILE; do 
    echo "Copying $FILE.." 
    cp "$FILE" /destination 
done 
6

Sadece eşittir işaretinin etrafında boşlukları koymayın: Mümkünse onlar kaldırılmış konum beri

ar=($(find . -name "*.txt")) 

, komutu ters tırnak kaçının. Özellikle kötü fontlarda, apostrof ile kolayca karışabilirler ve çok iyi yuvalamazlar.

Çoğu durumda, -exec, -execdir, -ok veya -okdir ile doğrudan bir bulma sonucunu kullanarak yinelediğinizde en iyi şekilde sunulacaksınız.

Döngüler dosya isimlerinde veya satırsonları ve sekmelerdeki boşluklar söz konusu olduğunda doğru yapmak zor olsa da.

{} Maskelemeye gerek yoktur. Sık sık/kombinasyonu bulmak çok ek işlemini başlatır xargs göreceksiniz:

find ./ -name "*.txt" | xargs grep {} ";" 
14

Sadece dosyaların tam listesi için çalışacak bir yankı yapıyordu ben Johannes Weiß solüsyonu ile sorunu yaşıyordu. Ancak, bir sonraki satırda ffmpeg çalıştırmayı denediysem, komut dosyası yalnızca karşılaştığı ilk dosyayı işleyecektir. Borunun neden olduğu bazı IFS komik işlerini üstlendim ama bunu anlayamadım ve bunun yerine bir for döngüsü ile koştum:

for i in $(find . -name '*.mov'); 
do 
    echo "$i" 
done 
+1

Bu, dosya adlarındaki boşluk için başarısız oluyor – spinup

İlgili konular