Bagaimana cara menggunakan grep untuk mencari direktori saat ini untuk semua file yang memiliki string "hello" namun hanya menampilkan file .h dan .cc?

142

Bagaimana cara menggunakan grep untuk mencari direktori saat ini untuk setiap dan semua file yang berisi string "hello" dan hanya menampilkan file .h dan .cc?

stackoverflow
sumber

Jawaban:

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

Ini berbunyi: cari secara rekursif (di semua sub direktori juga) untuk semua file .cc ATAU .h yang berisi "halo" di .direktori (saat ini)

Dari pertanyaan stackoverflow lainnya

stackoverflow
sumber
5
Dalam posting asli Anda mengatakan "direktori saat ini" dan tidak ada tentang membutuhkannya secara rekursif atau di sub direktori (saya menyadari Anda menyebutkannya di posting selanjutnya). Bagi mereka yang tertarik dengan cara melakukannya hanya di direktori saat ini, itu grep -si "hello" --include=*.{cc,h} ./* ./.*(juga mencari file tersembunyi). Berikut adalah versi generik untuk mencari string dalam semua / file tersembunyi: grep -s "hello" * .*. Mungkin yang paling berguna secara umum (dan paling sederhana), ini mencari semua file non-tersembunyi untuk "hello": grep -si "hello" ./* Berkat posting ini: askubuntu.com/a/777456
jbobbins
1
grep -r --include=*.{java,py} "hello" .
Untuk beberapa alasan, ini tidak berfungsi di macOS, bahkan saat menggunakan utilitas grep GNU.
xApple
49

Anda dapat memasukkan karakter pengganti sebagai ganti menentukan nama file atau menggunakan stdin.

grep hello *.h *.cc
Donald Miner
sumber
Saya membutuhkan semua sub direktori juga
stackoverflow
-RSayangnya, menambahkan tidak berfungsi. Ini memperluas *sebelum pergi secara rekursif.
Donald Miner
Jawaban Noufal adalah apa yang Anda cari jika Anda membutuhkan subdirektori
Donald Miner
9
@Jammin Anda harus menjelaskannya dengan jelas saat mengajukan pertanyaan. Jawaban ini adalah jawaban yang "benar" untuk pertanyaan Anda.
jordanm
$ grep -R hello *# temukan dari semua kata yang mengandung halo (termasuk sub direktori)
19

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

Periksa halaman manual untuk finddan xargsuntuk detailnya.

Noufal Ibrahim
sumber
1
Anda harus memiliki -print0setelah '*.cc'sebagai jika tidak, Anda tidak memiliki tindakan untuk bagian pencarian tersebut. Atau Anda harus memasukkan kurung di sana: find . \( -name '*.cc' -or -name '*.h' \) -print0.
Jonathan Leffler
Terima kasih telah memperhatikan itu. Saya telah mengedit jawaban untuk "memperbaikinya".
Noufal Ibrahim
3
Anda juga dapat menggunakan find -exec +sintaks sebagai pengganti xargs
jordanm
@jordanm: Ya: di -exec grep "hello" {} +mana sepasang kurung kurawal mewakili nama file. Saran yang bagus.
Jonathan Leffler
11

Untuk mencari di direktori saat ini secara rekursif:

grep -r 'myString' .
AB Abhi
sumber
5

Jika Anda membutuhkan pencarian rekursif, Anda memiliki berbagai pilihan. Anda harus mempertimbangkan ack.

Gagal melakukannya, jika Anda memiliki GNU finddan xargs:

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

Penggunaan /dev/nullmemastikan Anda mendapatkan nama file yang dicetak; yang -print0dan -0penawaran dengan nama file yang mengandung spasi (baris baru, dll).

Jika Anda tidak memiliki nama yang menonjol (dengan spasi dll), Anda dapat menggunakan:

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

Ini mungkin mengambil beberapa nama yang tidak Anda inginkan, karena kecocokan polanya lebih kabur (tetapi lebih sederhana), tetapi sebaliknya berfungsi. Dan ini bekerja dengan versi non-GNU finddan xargs.

Jonathan Leffler
sumber
perhatikan Anda juga bisa mengatakanfind ... -exec grep "hello" {} +
fedorqui 'JADI berhenti merugikan'
5

Jika saya membaca pertanyaan Anda dengan cermat, Anda akan bertanya ke "grep untuk mencari direktori saat ini untuk setiap dan semua file yang berisi string" halo "dan hanya menampilkan file .h dan .cc". Jadi untuk memenuhi persyaratan tepat Anda, inilah kiriman saya:

Ini menampilkan nama file:

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

... dan ini menampilkan nama file dan isinya:

grep hello `grep -lR hello * | egrep '(cc|h)$'`
Mendongkrak
sumber
2
grep -l hello **/*.{h,cc}

Anda mungkin ingin shopt -s nullglobmenghindari pesan kesalahan jika tidak ada file .h atau .cc.

glenn jackman
sumber
4
Saya tahu cara menggunakan google dll. Saya menanyakannya di sini karena beberapa jawaban memiliki "-l" dan senang memiliki semua informasi di satu tempat.
Andrew Swift
-l (Huruf kecil "el") Menekan keluaran normal. Mencetak nama setiap file masukan yang biasanya digunakan untuk mencetak keluaran biasanya. Pemindaian / pencarian akan berhenti pada pertandingan pertama.
Rex CoolCode Charles
-1

Cara termudah: grep -Ril "Teks Anda" /

pengguna1733951
sumber
1
Ini tidak hanya menampilkan file .h atau .cc dan berguna untuk menjelaskan opsi mana yang Anda gunakan dan mengapa.
kon psych