Jawaban:
Nah, kasus umum yang bekerja dengan perintah apa pun yang menulis ke stdout adalah menggunakan xargs, yang akan memungkinkan Anda melampirkan sejumlah argumen baris perintah ke akhir perintah:
$ find … | xargs grep 'search'
Atau untuk menanamkan perintah di grepbaris Anda dengan backticks atau $(), yang akan menjalankan perintah dan mengganti hasilnya:
$ grep 'search' $(find …)
Perhatikan bahwa perintah ini tidak berfungsi jika nama file berisi spasi, atau "karakter aneh" tertentu lainnya ( \'"untuk xargs, \[*?untuk $(find …)).
Namun, dalam kasus khusus findkemampuan untuk mengeksekusi program pada argumen yang diberikan adalah bawaan:
$ find … -exec grep 'search' {} \;
Segala sesuatu di antara -execdan ;merupakan perintah untuk dijalankan; {}diganti dengan nama file yang ditemukan oleh find. Itu akan mengeksekusi terpisah grepuntuk setiap file; karena grepdapat mengambil banyak nama file dan mencari semuanya, Anda dapat mengubah ;to +to tell find untuk meneruskan semua nama file yang cocok grepsekaligus:
$ find … -exec grep 'search' {} \+
find ... -type f -print0 | xargs -r0 grep 'search' /dev/null. QED. Meskipun -exec +sangat efisien, itu tidak ada di semua versi find.
$ find … -exec grep 'search' {} \+formulir jauh lebih cepat.
Beberapa versi grep(misalnya pada Linux yang tidak tertanam atau BSD atau Mac OS X) memiliki -ropsi untuk melakukan pencarian rekursif. Pada OpenBSD, gunakan -R(dan tidak ada --excludeseperti pada contoh di bawah). Ini mencakup kombinasi sederhana finddengan grep.
Jika implementasi Anda tidak memiliki -Rbendera, atau jika Anda ingin kriteria pencocokan file yang lebih bagus, Anda dapat menggunakan -executama finduntuk membuatnya mengeksekusi grep. Beberapa findimplementasi lama tidak mendukung -exec... +; pada sistem ini, gunakan ;bukan +(ini akan memanggil grepsekali per file, jadi akan lebih lambat, tetapi jika tidak hasilnya akan sama). Perhatikan /dev/nulltrik yang menyebabkan grepmenampilkan nama file bahkan jika kebetulan dipanggil pada satu file (grep GNU dan grep FreeBSD / NetBSD / OSX memiliki -Hopsi untuk mencapai efek yang sama).
find . -type f -name '*.o' -prune -o -exec grep 'needle' /dev/null {} +
grep -r --exclude='*.o' 'needle' .
GNU grepmemiliki -Hopsi untuk selalu mencetak nama file.