-EXEC kullanarak FIND sonuçlarını nasıl elde edebilirim ve hala bir dosyaya nasıl çıktırabilirim?


64

Örnekleri açıklamak daha iyi.

Yapabilirim:

find . -name "*.py" -type f > output.txt

Ancak çıktıyı aynı dosyaya nasıl saklayabilirim:

find . -name "*.py" -type f -exec grep "something" {} \

Sadece yapamam

find . -name "*.py" -type f -exec grep "something" {} \ > output.txt

Yanıtlar:


105

Seni doğru anlarsam, yapmak istediğin şey bu:

find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt

Finduzantılı tüm dosyalar py, grepsadece satırları içeren somethingve içine alan satırlar output.txt. Dosya bir şey içeriyorsa değiştirilecektir.

Düzenleme: -exec kullanarak:

find . -name '*.py' -exec grep 'something' {} \; > output.txt

Chris Downs'un yorumunu buraya ekliyorum. Yukarıdaki komut, buldukların meydana geldiği grepkadar çok kez çalıştırılmasına neden olur find. Değiştirmeye Ancak, ;bir ile +, grepgelen çıkışıyla denir find(belli bir sınıra kadar) birleştirilmiş. Konuyla ilgili daha fazla bilgi edinmek için exec ile noktalı virgül (;) vs artı (+) kullanımı sorusuna bakın .


16
+Bunun yerine kullanım \;, yürütme süresini önemli ölçüde iyileştirir (yürütmeden önce argümanları daraltacağından dolayı ARG_MAX).
Chris Down,

Şimdi xargların gücünü anlıyorum! Teşekkürler!
domih

4
grep -HDosyanın dosya adını çıktıya dahil etmek istiyorsanız kullanın .
Steinar

18

Eşleşen tüm satırları tüm dosyalara kaydetmek istiyorsanız , komutun sonunda output.txtgerekli ;olanı kaçırmamanız dışında son komutunuz çalışır .

find . -name "*.py" -type f -exec grep "something" {} \; > output.txt

Her çalıştırmanın grepfarklı bir dosyaya çıktı üretmesini istiyorsanız , çıktı dosyasının adını hesaplamak ve yeniden yönlendirmeyi gerçekleştirmek için bir kabuk çalıştırın.

find . -name "*.py" -type f -exec sh -c 'grep "something" <"$0" >"$0.txt"' {} \;

sonuncusu gerçekten güzel: D
bakytn 20:11

Gilles cevabını genişletmek için biraz daha bilgilendirici hale getirmek üzere cevabını genişletmek, özellikle uğraştığınız dosyaların listesi büyükse, bunu kullanarak her bir dosyanın dosya adını (göreceli yol) rapor ederek : find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt Ve eğer kullanılabilinir grep'ed hatlarının hat numaralarını görmek isterseniz, elbette, kullanabilirsinizgrep -n "something"
JJMpls

9

Kayıt için, grepsahip --includeve --excludebunu arar dosyaları filtrelemek için kullanabileceğiniz argümanlar:

grep -r --include="*.py" "something" > output.txt

2
En azından GNU grepyapar.
phk

2

Kullanım tee:

find . -name '*.py' | tee output.txt | xargs grep 'something'

İkaz, sen (boşluklar dahil) özel karakterler ile herhangi bir dosya varsa olduğunu xargsve grep(iyi çalışmaz a file.txtiki dosyaları olarak yorumlanır, edilecek ave file.txt). Buna alternatif ya kullanmaktır -xOr -print0, ancak bunlardan Ya kirletir output.txt. -xKullanacaktır \belli özel karakterler kaçmayı ve bu olacaktır output.txt. -print0(Aynı zamanda gerektiren bir alan ayırıcı olarak boş bayt kullanır xargs -0) ve output.txtmetnin bir uzun bitişik çizgi gibi görünür.

Bununla nasıl başa çıkacağınız (veya yapmadığınız) size kalmış.

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.