Sebagai catatan, inilah pendekatan yang saya sukai:
grep pattern $(find . -type f ! -path './test/main.cpp')
Dengan menjaga grepdi awal perintah, saya pikir ini sedikit lebih jelas - plus itu tidak menonaktifkan greppenyorotan warna. Dalam arti tertentu, menggunakan findsubstitusi perintah hanyalah cara untuk memperluas / mengganti subset grepfungsi pencarian file (terbatas) .
Bagi saya, find -execsintaksinya agak misterius. Satu kompleksitas dengan find -execadalah (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 findsolusi berbasis untuk digunakan dalam skrip : Baris grepperintah 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 greppencarian file asli (dengan -ropsi).
... Bahkan lebih baik, adalah memasukkan /dev/nullsebagai file pertama yang dicari. Ini memecahkan dua masalah:
- Ini memastikan bahwa jika ada satu file untuk dicari,
grepakan berpikir ada dua dan menggunakan mode keluaran multi-file.
- Ini memastikan bahwa jika tidak ada file untuk dicari,
grepakan 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.