Dengan find
:
cd /the/dir
find . -type f -exec grep pattern {} +
( -type f
adalah hanya mencari di file biasa (juga mengecualikan symlink bahkan jika mereka menunjuk ke file biasa). Jika Anda ingin mencari di semua jenis file kecuali direktori (tapi waspadalah ada beberapa jenis file seperti fifos atau / dev / zero yang Anda umumnya tidak ingin membaca), ganti -type f
dengan GNU-spesifik ! -xtype d
( -xtype d
cocok untuk file-file dari direktori tipe setelah resolusi symlink)).
Dengan GNU grep
:
grep -r pattern /the/dir
(tetapi berhati-hatilah bahwa kecuali Anda memiliki versi terbaru GNU grep, itu akan mengikuti symlink ketika turun ke direktori). File tidak biasa tidak akan dicari kecuali Anda menambahkan -D read
opsi. Versi terbaru dari GNU grep
masih tidak akan mencari di dalam symlink.
Versi GNU yang sangat lama find
tidak mendukung {} +
sintaks standar , tetapi di sana Anda dapat menggunakan non-standar:
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
Pertunjukan cenderung terikat I / O. Itu adalah waktu untuk melakukan pencarian akan menjadi waktu yang dibutuhkan untuk membaca semua data dari penyimpanan.
Jika data pada array disk yang redundan, membaca beberapa file sekaligus dapat meningkatkan kinerja (dan sebaliknya dapat menurunkannya). Jika kinerjanya tidak terikat I / O (karena misalnya semua data ada dalam cache), dan Anda memiliki banyak CPU, lakukan bersamaangreps
dapat juga membantu. Anda dapat melakukannya dengan GNU xargs
's -P
pilihan.
Misalnya, jika data pada array RAID1 dengan 3 drive, atau jika data dalam cache dan Anda memiliki 3 CPU yang waktunya luang:
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(di sini menggunakan -n1000
untuk menelurkan yang baru grep
setiap 1000 file, hingga 3 berjalan secara paralel pada suatu waktu).
Namun perhatikan bahwa jika output grep
diarahkan, Anda akan berakhir dengan output yang disisipkan sangat buruk dari 3 grep
proses, dalam hal ini Anda mungkin ingin menjalankannya sebagai:
find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(pada sistem GNU atau FreeBSD baru-baru ini) atau gunakan --line-buffered
opsi GNU grep
.
Jika pattern
string tetap, menambahkan -F
opsi dapat memperbaiki masalah.
Jika itu bukan data karakter multi-byte, atau jika untuk pencocokan pola itu, tidak masalah apakah data tersebut karakter multi-byte atau tidak, maka:
cd /the/dir &&
LC_ALL=C grep -r pattern .
dapat meningkatkan kinerja secara signifikan.
Jika Anda akhirnya sering melakukan pencarian seperti itu, maka Anda mungkin ingin mengindeks data Anda menggunakan salah satu dari banyak mesin pencari di luar sana.
find
denganxargs
ataugrep -R