Vấn đề bạn gặp phải là trước tiên trình phân tích cú pháp dòng lệnh và thấy hai lệnh đơn giản được phân tách bởi &&toán tử: find . -iname \*.csv -exec grep foo {}và echo {} \;. Trích dẫn &&( find . -iname \*.csv -exec grep foo {} '&&' echo {} \;) bỏ qua đó, nhưng bây giờ các lệnh được thực hiện bởi findmột cái gì đó giống như grepvới các đối số foo, wibble.csv, &&, echovà wibble.csv. Bạn cần hướng dẫn findđể chạy shell sẽ giải thích &&toán tử:
find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;
Lưu ý rằng đối số đầu tiên sau sh -c SOMECOMMANDlà $0, không $1.
Bạn có thể tiết kiệm thời gian khởi động của một tiến trình shell cho mọi tệp bằng cách nhóm các lệnh yêu cầu với -exec … +. Để dễ xử lý, hãy chuyển một số giá trị giả $0để "$@"liệt kê tên tệp.
find . -iname \*.csv -exec sh -c 'for x in "$@"; do grep foo "$x" && echo "$x"; done' \ {} +
Nếu lệnh shell chỉ là hai chương trình cách nhau &&, findcó thể tự thực hiện công việc: viết hai -exechành động liên tiếp và hành động thứ hai sẽ chỉ được thực hiện nếu chương trình đầu tiên thoát với trạng thái 0.
find . -iname \*.csv -exec grep foo {} \; -exec echo {} \;
(Tôi cho rằng grepvà echochỉ nhằm mục đích minh họa, vì -exec echocó thể được thay thế -printvà kết quả đầu ra không đặc biệt hữu ích.)
-exectheo thứ tự hoặc sử dụng một-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;.