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?
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?
Jawaban:
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)
Anda dapat memasukkan karakter pengganti sebagai ganti menentukan nama file atau menggunakan stdin.
grep hello *.h *.cc
-R
Sayangnya, menambahkan tidak berfungsi. Ini memperluas *
sebelum pergi secara rekursif.
find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello"
.
Periksa halaman manual untuk find
dan xargs
untuk detailnya.
-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.
Jika Anda membutuhkan pencarian rekursif, Anda memiliki berbagai pilihan. Anda harus mempertimbangkan ack
.
Gagal melakukannya, jika Anda memiliki GNU find
dan xargs
:
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
dan xargs
.
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)$'`
grep -l hello **/*.{h,cc}
Anda mungkin ingin shopt -s nullglob
menghindari pesan kesalahan jika tidak ada file .h atau .cc.
Cara termudah: grep -Ril "Teks Anda" /
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