Sebagai catatan, inilah pendekatan yang saya sukai:
grep pattern $(find . -type f ! -path './test/main.cpp')
Dengan menjaga grep
di awal perintah, saya pikir ini sedikit lebih jelas - plus itu tidak menonaktifkan grep
penyorotan warna. Dalam arti tertentu, menggunakan find
substitusi perintah hanyalah cara untuk memperluas / mengganti subset grep
fungsi pencarian file (terbatas) .
Bagi saya, find -exec
sintaksinya agak misterius. Satu kompleksitas dengan find -exec
adalah (kadang-kadang) kebutuhan untuk melarikan diri dari berbagai karakter (terutama jika \;
digunakan di bawah Bash). Hanya untuk tujuan menempatkan hal-hal ke dalam konteks yang akrab, dua perintah berikut pada dasarnya setara:
find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern
Jika Anda ingin mengecualikan subdirektori , mungkin perlu menggunakan wildcard. Saya tidak sepenuhnya memahami skema di sini - bicara tentang misterius :
grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )
Satu catatan lebih lanjut untuk menggeneralisasi find
solusi berbasis untuk digunakan dalam skrip : Baris grep
perintah harus menyertakan opsi -H
/ --with-filename
. Kalau tidak, itu akan mengubah format output di bawah keadaan yang hanya ada satu nama file di hasil pencarian find
. Ini penting karena tampaknya tidak perlu jika menggunakan grep
pencarian file asli (dengan -r
opsi).
... Bahkan lebih baik, adalah memasukkan /dev/null
sebagai file pertama yang dicari. Ini memecahkan dua masalah:
- Ini memastikan bahwa jika ada satu file untuk dicari,
grep
akan berpikir ada dua dan menggunakan mode keluaran multi-file.
- Ini memastikan bahwa jika tidak ada file untuk dicari,
grep
akan berpikir ada satu file dan tidak menunggu di stdin.
Jadi jawaban akhirnya adalah:
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')
--exclude-dir
). Itu sebabnya saya ingin membuat grep melakukan pengecualian secara asli.