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 find
một cái gì đó giống như grep
với các đối số foo
, wibble.csv
, &&
, echo
và 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 SOMECOMMAND
là $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 &&
, find
có thể tự thực hiện công việc: viết hai -exec
hà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 grep
và echo
chỉ nhằm mục đích minh họa, vì -exec echo
có thể được thay thế -print
và kết quả đầu ra không đặc biệt hữu ích.)
-exec
theo thứ tự hoặc sử dụng một-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;
.