Câu trả lời:
Chà, trường hợp chung hoạt động với bất kỳ lệnh nào ghi vào thiết bị xuất chuẩn là sử dụng xargs, điều này sẽ cho phép bạn đính kèm bất kỳ số lượng đối số dòng lệnh nào vào cuối lệnh:
$ find … | xargs grep 'search'
Hoặc để nhúng lệnh trong grepdòng của bạn bằng backticks hoặc $(), nó sẽ chạy lệnh và thay thế đầu ra của nó:
$ grep 'search' $(find …)
Lưu ý rằng các lệnh này không hoạt động nếu tên tệp chứa khoảng trắng hoặc một số ký tự kỳ lạ khác của Wikipedia ( \'"đối với xargs, \[*?for $(find …)).
Tuy nhiên, trong trường hợp cụ thể find, khả năng thực thi chương trình trên các đối số đã cho được tích hợp sẵn:
$ find … -exec grep 'search' {} \;
Tất cả mọi thứ giữa -execvà ;là lệnh để thực thi; {}được thay thế bằng tên tệp được tìm thấy bởi find. Điều đó sẽ thực thi riêng grepcho từng tệp; vì grepcó thể lấy nhiều tên tệp và tìm kiếm tất cả, bạn có thể thay đổi thành ;để +tìm tìm để chuyển tất cả tên tệp phù hợp thành grepcùng một lúc:
$ find … -exec grep 'search' {} \+
find ... -type f -print0 | xargs -r0 grep 'search' /dev/null. QED. Mặc dù -exec +rất hiệu quả, nó không tồn tại trên tất cả các phiên bản tìm kiếm.
$ find … -exec grep 'search' {} \+hình thức là nhiều nhanh nhất.
Một số phiên bản grep(ví dụ: trên Linux hoặc BSD hoặc Mac OS X không nhúng ) có -rtùy chọn để thực hiện tìm kiếm đệ quy. Trên OpenBSD, sử dụng -R(và không có --excludenhư trong ví dụ bên dưới). Điều này bao gồm các kết hợp đơn giản findvới grep.
Nếu việc triển khai của bạn không có -Rcờ hoặc nếu bạn muốn các tiêu chí khớp với tệp fancier, bạn có thể sử dụng -execchính findđể thực hiện nó grep. Một vài cũ findtriển khai không hỗ trợ -exec... +; trên các hệ thống này, hãy sử dụng ;thay vì +(điều này sẽ gọi grepmột lần cho mỗi tệp, vì vậy nó sẽ chậm hơn, nhưng nếu không thì kết quả sẽ giống nhau). Lưu ý /dev/nullmẹo để gây ra grepđể hiển thị tên tệp ngay cả khi nó được gọi trên một tệp duy nhất (GNU grep và FreeBSD / NetBSD / OSX grep có -Htùy chọn để đạt được hiệu ứng tương tự).
find . -type f -name '*.o' -prune -o -exec grep 'needle' /dev/null {} +
grep -r --exclude='*.o' 'needle' .
GNU grepcó -Htùy chọn để luôn luôn in tên tệp.