Có hai giải pháp dễ dàng cho việc này. Về cơ bản, sử dụng xargs
hoặc parallel
.
Cách tiếp cận xargs:
Bạn có thể sử dụng xargs
với find
như sau:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
Nơi bạn sẽ thay thế number_of_processes
bằng số lượng quá trình tối đa bạn muốn được khởi chạy. Tuy nhiên, điều này không được đảm bảo để cung cấp cho bạn một hiệu suất đáng kể trong trường hợp hiệu suất của bạn bị hạn chế I / O. Trong trường hợp đó, bạn có thể cố gắng bắt đầu nhiều quy trình hơn để bù cho thời gian bị mất đang chờ I / O.
Ngoài ra, với việc bao gồm tìm kiếm, bạn có thể chỉ định các tùy chọn nâng cao hơn thay vì chỉ các mẫu tệp, như thời gian sửa đổi, v.v ...
Một vấn đề có thể xảy ra với cách tiếp cận này như được giải thích bởi các bình luận của Stéphane, nếu có ít tệp, xargs
có thể không bắt đầu đủ nhiều quy trình cho chúng. Một giải pháp sẽ là sử dụng -n
tùy chọn xargs
để chỉ định số lượng đối số cần lấy từ đường ống tại một thời điểm. Cài đặt -n1
sẽ buộc xargs
bắt đầu một quy trình mới cho mỗi tệp duy nhất. Đây có thể là một hành vi mong muốn nếu các tệp rất lớn (như trong trường hợp của câu hỏi này) và có một số lượng tệp tương đối nhỏ. Tuy nhiên, nếu bản thân các tệp nhỏ, chi phí bắt đầu một quy trình mới có thể làm giảm lợi thế của tính song song, trong trường hợp đó, -n
giá trị lớn hơn sẽ tốt hơn. Do đó, -n
tùy chọn có thể được điều chỉnh tốt theo kích thước và số tập tin.
Cách tiếp cận song song:
Một cách khác để làm điều đó là sử dụng công cụ song song Ole Tange GNU parallel
, (có sẵn tại đây ). Điều này cung cấp khả năng kiểm soát hạt tốt hơn đối với sự song song và thậm chí có thể được phân phối trên nhiều máy chủ (sẽ có ích nếu thư mục của bạn được chia sẻ chẳng hạn). Cú pháp đơn giản nhất sử dụng song song sẽ là:
find . -type f | parallel -j+1 grep mypattern
trong đó tùy chọn -j+1
hướng dẫn song song để bắt đầu một quá trình vượt quá số lượng lõi trên máy của bạn (Điều này có thể hữu ích cho các nhiệm vụ giới hạn I / O, thậm chí bạn có thể cố gắng tăng số lượng cao hơn).
Song song cũng có lợi thế hơn xargs
là thực sự giữ lại thứ tự đầu ra từ mỗi quy trình và tạo ra đầu ra liền kề. Ví dụ, với xargs
, nếu quy trình 1 tạo ra một dòng nói p1L1
, quy trình 2 tạo ra một dòng p2L1
, quy trình 1 tạo ra một dòng khác p1L2
, đầu ra sẽ là:
p1L1
p2L1
p1L2
trong khi đó với parallel
đầu ra phải là:
p1L1
p1L2
p2L1
Điều này thường hữu ích hơn xargs
đầu ra.