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?
142
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)
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/777456grep -r --include=*.{java,py} "hello" .
Anda dapat memasukkan karakter pengganti sebagai ganti menentukan nama file atau menggunakan stdin.
sumber
-R
Sayangnya, menambahkan tidak berfungsi. Ini memperluas*
sebelum pergi secara rekursif.$ grep -R hello *
# temukan dari semua kata yang mengandung halo (termasuk sub direktori)find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello"
.Periksa halaman manual untuk
find
danxargs
untuk detailnya.sumber
-print0
setelah'*.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
.find -exec +
sintaks sebagai pengganti xargs-exec grep "hello" {} +
mana sepasang kurung kurawal mewakili nama file. Saran yang bagus.Untuk mencari di direktori saat ini secara rekursif:
grep -r 'myString' .
sumber
Jika Anda membutuhkan pencarian rekursif, Anda memiliki berbagai pilihan. Anda harus mempertimbangkan
ack
.Gagal melakukannya, jika Anda memiliki GNU
find
danxargs
:find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null
Penggunaan
/dev/null
memastikan Anda mendapatkan nama file yang dicetak; yang-print0
dan-0
penawaran 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
find
danxargs
.sumber
find ... -exec grep "hello" {} +
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)$'`
sumber
Anda mungkin ingin
shopt -s nullglob
menghindari pesan kesalahan jika tidak ada file .h atau .cc.sumber
Cara termudah: grep -Ril "Teks Anda" /
sumber