Ada dua solusi mudah untuk ini. Pada dasarnya, menggunakan xargs
atau parallel
.
Pendekatan xargs:
Anda dapat menggunakan xargs
dengan find
sebagai berikut:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
Di mana Anda akan mengganti number_of_processes
dengan jumlah maksimum proses yang ingin Anda luncurkan. Namun, ini tidak dijamin untuk memberi Anda kinerja yang signifikan jika kinerja Anda terbatas I / O. Dalam hal ini Anda mungkin mencoba untuk memulai lebih banyak proses untuk mengkompensasi waktu yang hilang menunggu I / Os.
Juga, dengan dimasukkannya find, Anda dapat menentukan opsi lebih lanjut daripada hanya pola file, seperti waktu modifikasi, dll ...
Satu kemungkinan masalah dengan pendekatan ini seperti yang dijelaskan oleh komentar Stéphane, jika ada beberapa file, xargs
mungkin tidak memulai cukup banyak proses untuk mereka. Salah satu solusinya adalah dengan menggunakan -n
opsi untuk xargs
menentukan berapa banyak argumen yang harus diambil dari pipa sekaligus. Pengaturan -n1
akan memaksa xargs
untuk memulai proses baru untuk setiap file tunggal. Ini mungkin perilaku yang diinginkan jika file-file tersebut sangat besar (seperti dalam kasus pertanyaan ini) dan ada sejumlah kecil file. Namun, jika file itu sendiri kecil, overhead memulai proses baru dapat merusak keunggulan paralelisme, dalam hal ini -n
nilai yang lebih besar akan lebih baik. Dengan demikian, -n
opsi mungkin akan disesuaikan dengan ukuran dan jumlah file.
Pendekatan Paralel:
Cara lain untuk melakukannya adalah dengan menggunakan alat Paralel Ole Tange GNU parallel
, (tersedia di sini ). Ini menawarkan kontrol butir yang lebih baik atas paralelisme dan bahkan dapat didistribusikan melalui beberapa host (akan bermanfaat jika direktori Anda dibagikan misalnya). Sintaks paling sederhana menggunakan paralel adalah:
find . -type f | parallel -j+1 grep mypattern
di mana opsi -j+1
menginstruksikan paralel untuk memulai satu proses yang melebihi jumlah core pada mesin Anda (Ini dapat membantu untuk tugas-tugas terbatas I / O, Anda bahkan dapat mencoba untuk melangkah lebih tinggi jumlahnya).
Paralel juga memiliki keunggulan dibandingkan xargs
dengan benar-benar mempertahankan urutan output dari setiap proses dan menghasilkan output yang berdekatan. Misalnya, dengan xargs
, jika proses 1 menghasilkan garis katakan p1L1
, proses 2 menghasilkan garis p2L1
, proses 1 menghasilkan garis lain p1L2
, hasilnya akan menjadi:
p1L1
p2L1
p1L2
sedangkan dengan parallel
output harus:
p1L1
p1L2
p2L1
Ini biasanya lebih bermanfaat daripada xargs
output.