Mevcut dizinde “merhaba” dizesi bulunan ancak yalnızca .h ve .cc dosyalarını görüntüleyen tüm dosyaları aramak için grep'i nasıl kullanabilirim?


139

Geçerli dizinde "merhaba" dizesini içeren tüm dosyaları aramak ve yalnızca .h ve .cc dosyalarını görüntülemek için grep'i nasıl kullanabilirim?

Yanıtlar:


161
grep -r --include=*.{cc,h} "hello" .

Bu okur: bu .(geçerli) dizinde "merhaba" içeren tüm .cc OR .h dosyaları için özyinelemeli (tüm alt dizinlerde de)

Başka bir yığın akışı sorusundan


5
Orijinal yazıda "geçerli dizin" ve özyinelemeli veya alt dizinlerde ihtiyacı hakkında hiçbir şey söylemediniz (daha sonraki bir yazıda bahsettiğinizi anlıyorum). Sadece geçerli dizinde nasıl yapılacağı ile ilgilenenler için, grep -si "hello" --include=*.{cc,h} ./* ./.*(gizli dosyaları da arar). İşte bütün / gizli dosyalarda bir dize aramak için jenerik sürümü: grep -s "hello" * .*. Belki en genel kullanışlı (ve en basit), "Merhaba" için bu aramalar olmayan tüm gizli dosyalar: grep -si "hello" ./* Bu yazı sayesinde: askubuntu.com/a/777456
jbobbins

1
grep -r --include=*.{java,py} "hello" .

Nedense bu GNU grep yardımcı programını kullanırken bile macOS üzerinde çalışmaz.
xApple

49

Dosya adlarını belirtmek veya stdin kullanmak yerine joker karakterler geçirebilirsiniz.

grep hello *.h *.cc

Ayrıca tüm alt dizinlere ihtiyacım var
stackoverflow

Eklemek -Rmaalesef çalışmıyor. *Özyinelemeden önce genişler .
Donald Miner

Alt dizinlere ihtiyacınız varsa Noufal'ın cevabı aradığınız şeydir
Donald Miner

8
@ Jammin Soruyu sorurken bu konuda net olmalısınız. Bu cevap, belirttiğiniz sorunun "doğru" cevabıdır.
jordanm

$ grep -R hello *# tüm kelimeden bul merhaba içerir (alt dizin dahil)

19

find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello".

İçin manuel sayfaları kontrol edin findve xargsdetaylar için.


1
Bir olmak zorunda -print0sonra '*.cc'aksi takdirde arama bu bölümü için bir eylem yok gibi. Yoksa orada parantez eklemek zorunda: find . \( -name '*.cc' -or -name '*.h' \) -print0.
Jonathan Leffler

Bunu fark ettiğiniz için teşekkürler. Cevabı "düzeltmek" için düzenledim.
Noufal Ibrahim

3
Ayrıca find -exec +xargs yerine sözdizimini de kullanabilirsiniz
jordanm

@jordanm: Evet: -exec grep "hello" {} +parantez çifti dosya adlarını temsil eder. İyi öneri.
Jonathan Leffler

10

Geçerli dizinde özyinelemeli olarak arama yapmak için:

grep -r 'myString' .

5

Yinelemeli aramaya ihtiyacınız varsa, çeşitli seçenekleriniz vardır. Düşünmelisinack .

Bu başarısız olursa, GNU'nuz varsa findve xargs:

find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null

Kullanımı, /dev/nulldosya adlarının yazdırılmasını sağlar; -print0ve-0 boşluklar içeren dosya adları (yeni satırlar, vs) ile fırsatlar.

Obstreperous adlarınız yoksa (boşluklar vb.), Şunları kullanabilirsiniz:

find . -name '*.*[ch]' -print | xargs grep hello /dev/null

Bu, desen eşleşmesi daha bulanık (ancak daha basit), ancak aksi takdirde işe yaramadığı için, amaçlamadığınız birkaç adı alabilir. Ve findve GNU olmayan sürümleri ile çalışır xargs.


Ayrıca şunu da söyleyebilirsinizfind ... -exec grep "hello" {} +
fedorqui 'SO

5

Sorunuzu dikkatle okursam, "grep " içinde "hello" dizesini içeren tüm dosyaları arar ve yalnızca .h ve .cc dosyalarını görüntüler ". Kesin gereksinimlerinizi karşılamak için burada benim teslim:

Bu, dosya adlarını görüntüler:

grep -lR hello * | egrep '(cc|h)$'

... ve bu dosya adlarını ve içeriğini gösterir:

grep hello `grep -lR hello * | egrep '(cc|h)$'`

2
grep -l hello **/*.{h,cc}

shopt -s nullglob.H veya .cc dosyası yoksa hata iletilerinden kaçınmak isteyebilirsiniz .


4
Google vb nasıl kullanılacağını biliyorum. Ben burada sordum çünkü birkaç cevap "-l" ve tek bir yerde tüm bilgileri olması güzel.
Andrew Swift

-l (Küçük harf "el") Normal çıktıyı bastırır. Çıktının normal olarak yazdırılacağı her girdi dosyasının adını yazdırır. Tarama / arama ilk maçta durur.
Rex CoolCode Charles

-1

En basit yol: grep -Ril "Metniniz" /


1
Bu yalnızca .h veya .cc dosyalarını görüntülemez ve hangi seçenekleri kullandığınızı ve nedenini açıklamakta fayda vardır.
kon psych
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.