2012-10-18 20 views
21

birçok kaynakta} {her örneğini bulmak yoluyla bulunması dosya adı ile değiştirilecektir söylüyor, ama ben aşağıdakileri çalıştırmayı denediğinizde, sadece bir metin dosyası almak ve adı ".txt"Geçerli dosya adını ("{}") "find -exec" içinde birden çok kez kullanın?

find /directory -name "*pattern*" -exec cut -f8 {} > {}.txt \; 
olduğunu

Amaç, bulunan her dosyadan yalnızca sekizinci sütunu olan bir metin dosyası oluşturmak ve her bir metin dosyası ana dosyadan sonra adlandırılacaktı. İkinci {} kümesiyle ilgili bir şey, bulunan her dosyanın dosya adıyla değiştirilmiyor.

cevap

22

Dene:

find /directory -name "*pattern*" -exec sh -c 'cut -f8 {} > {}.txt' \; 

Ama bazı sürümleri ayrı bir argüman olarak {} gerektiren bulmak unutmayın, aksi takdirde bir dosya adına {} genişlemez. .

find /directory -name "*pattern*" -exec sh -c 'cut -f8 $0 > $0.txt' {} \; 

(eşleşti dosyayı içeren alt dizininde çıktı dosyasını koyacağız İsterseniz, ${0#*/}

yönlendirme yaparak bu önlemek olabilir bu alternatif komut konudur: Sen o çalışabilirsiniz find yönlendirmeyi yapmıyor olduğunu, kabuk hakimiyetin tamamen eşdeğerdir. standardından aşağıdaki

# Sample of INCORRECT code 
find /directory -name "*pattern*" -exec cut -f8 {} \; > {}.txt 

not:

"

" {} "yalnızca iki karakteri içeren birden fazla bağımsız değişken varsa, davranış belirtilmemiş.

Bir yardımcı program_adı veya argüman dizgisi "{}" iki karakterini içeriyorsa ancak "{}" iki karakterini içermiyorsa, bu iki karakterin yerini değiştirip değiştirmediğini veya değiştirmeden dizeyi kullanıp kullanmamasını tanımlayan uygulama tanımlaması yapılır. William Pursell onun cevabını sözü uyarılar ile ilgilenmek için

+0

Görüyorum ki, çözümünüz hile yaptı. Teşekkürler! > – user1757862

10

şunları kullanın:

Eğer sh -c kullandığınızda, yürütme dizisini izleyen argümanlardan konum parametreleri alır
find /directory -name "*pattern*" -exec sh -c 'cut -f8 "$1" > "$1.txt"' x {} \; 

. Ek x, $0 numaralı belgede doldurulur ve değiştirilen dosya adı $1 olur.

Çift tırnaklar, boşluk ve diğer özel karakterleri içeren dosya isimleriyle düzgün çalışmasını sağlar.

+0

+1 yanlış yorumlanıp yorumlanmadığını merak ediyordum: güzel teknik –

+0

0 $ 'ı kullanmamanın herhangi bir nedeni: sh -c' ... $ 0 ... '{} '? –

+0

Çoğunlukla sadece "yanlış" hissediyor - $ 0 kabuk değil, bir parametre olması gerekiyordu. Orada kullanmak için ne kadar taşınabilir olduğunu bilmiyorum. – Barmar

1
find /directory -name "*pattern*" | xargs awk '{z=FILENAME".txt";print $8>z}' 
İlgili konular