Ketika saya ingin melakukan pencarian grep rekursif di direktori saat ini, saya biasanya melakukan:
grep -ir "string" .
Tapi perintah itu mencari di dalam semua jenis file, termasuk file biner (gambar, audio, video, dll ...) yang menghasilkan proses pencarian yang sangat lambat.
Jika saya melakukan ini, misalnya, itu tidak berfungsi:
grep -ir "string" *.php
Itu tidak berfungsi karena tidak ada file PHP di dalam direktori saat ini, tetapi di dalam beberapa subdirektori di direktori saat ini, dan nama-nama subdirektori tidak diakhiri dengan ".php" sehingga grep tidak melihat di dalamnya.
Jadi, bagaimana saya bisa melakukan pencarian rekursif dari direktori saat ini tetapi juga menentukan wildcard nama file? (yaitu: hanya mencari di file yang berakhir dengan ekstensi tertentu)
grep -ir "string" --include="*.php" *
Jika Anda memiliki versi
grep
yang tidak memiliki--include
opsi, Anda dapat menggunakan yang berikut ini. Keduanya diuji pada struktur direktori seperti ini:Di mana semua
.php
file berisi stringstring
.Menggunakan
find
Penjelasan
Ini akan menemukan semua
.php
file dan kemudian menjalankannyagrep -H string
masing-masing. Denganfind
's-exec
pilihan,{}
digantikan oleh masing-masing file yang ditemukan. The-H
memberitahugrep
untuk mencetak nama file serta baris yang cocok.Dengan asumsi Anda memiliki versi yang cukup baru
bash
, gunakanglobstar
:Penjelasan
Seperti yang dijelaskan dalam manual bash :
Jadi, dengan menjalankan
shopt -s globstar
Anda mengaktifkan fitur danglobstar
opsi Bash yang membuat**/*php
perluas ke semua.php
file di direktori saat ini (**
cocok dengan 0 atau lebih direktori, jadi**/*php
cocok./foo.php
juga) yang kemudian diterimastring
.sumber
Menggunakan
*/*.php
Ini membuat pencarian grep menjadi satu tingkat subdirektori
sumber