bir dizindeki tüm dosyalarda grep işlemi nasıl yapılır


219

Xenserver ile çalışma ve ben bir dizinde olan her dosya üzerinde bir komut gerçekleştirmek, komut çıktısını bazı şeyler selamlamak ve bir dosyaya eklemek istiyorum.

Kullanmak istediğim komut ve gerektiğinde dize (ler) grep nasıl açık.

Ama net olmayan şeyim, daha fazla dosya bulunana kadar her dosyada bu komutu nasıl uygulayacağım.

Yanıtlar:


228

grep $PATTERN *yeterli olur. Varsayılan olarak, grep tüm alt dizinleri atlar. Ancak, eğer onları şaşırtmak istiyorsanız grep -r $PATTERN *, durum böyledir.


37
"grep -r $ PATTERN." yeterlidir. Özyinelemeli grep için tüm dosyaları belirtmeniz gerekmez
Cougar

1
Birden çok uzantıyı nasıl eklerim? Örneğin. "* .cpp", "* .h"?
Tomáš Zato - Monica'yı eski durumuna getir

1
@ Tomáš Zato, sadece *: yerine tüm dosya desenlerinizi sağlayın grep $PATTERN *.cpp *.h. Hangi dosyaların açılacağı konusunda daha spesifik kurallara ihtiyacınız varsa, findkomutunu kullanın (Rob'un yanıtını kontrol edin).
umi

@umi Çalıştırırsam grep -r x .sonuçları tüm uzantıların tüm dosyalarından gelir. Eğer grep -r x *.scsskoşarsam sonuç alamıyorum.
Chris

1
@Chris *.scss, mevcut dizinde ancak alt dizinlerde daha derin bir yerde dosyalara sahip olmanız mümkündür , bu nedenle grep istediğiniz tüm dosyalara bakmaz. --includeGrep'e belirli kalıplarla eşleşen dosyalar için özyinelemeli olarak bakmasını söylemek için seçeneği kullanmalısınız : grep -r x --include '*.scss' . (tırnaklara dikkat edin, kalıbın kabuk tarafından genişletilmesini önlerler). Veya sadece kullanın find(Rob'un cevabına bakınız).
umi

169

Linux'ta, normalde bu komutu dir.

grep -rni "string" *

nerede,

r = özyinelemeli yani, geçerli dizin içindeki alt dizinleri ara
n = satır numaralarını stdout'a yazdırmak için
i = büyük / küçük harf duyarsız arama


32

Bul komutunu kullanın. Cidden, bu en iyi yoldur, çünkü hangi dosyalarda çalıştığını gerçekten görebilirsiniz:

find . -name "*.sql" -exec grep -H "slow" {} \;

-H, mac'a özgüdür, sonuçlarda dosya adını gösterir.


7
Bul komutunu kullanmaya karar verirseniz, çıktıyı xargskullanmak yerine boru ile döşemek çok daha hızlı -execolacaktır , çünkü her grep için yeni bir süreç ortaya çıkar ve ek yük çok sayıda dosyayla önemli hale gelir. Dosya adlarındaki boşluklarla ilgili standart uyarılar geçerlidir . -execxargs
Barton Chittenden

2
Bu tam olarak nasıl olurdu? xargsSözdizimini daima unuturum .
Brian Peterson

3
@BrianPeterson böyle bir şey olurdu:find . -iname "*.sql" -print0 | xargs -0 grep "slow"
MediaVince

4

Tüm alt dizinlerde, ancak yalnızca belirli dosya türlerinde arama yapmak için grep ile kullanın --include.

Örneğin, geçerli dizinde özyinelemeli olarak arama yapmak için * .yml ve * .yaml içindeki metinleri arayın:

grep "text to search" -r . --include=*.{yml,yaml}

1

Birden fazla komut yapmak istiyorsanız şunları kullanabilirsiniz:

for I in `ls *.sql`
do
    grep "foo" $I >> foo.log
    grep "bar" $I >> bar.log
done
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.