Masalah yang Anda hadapi adalah shell pertama-tama mem-parsing baris perintah, dan melihat dua perintah sederhana yang dipisahkan oleh &&
operator:, find . -iname \*.csv -exec grep foo {}
dan echo {} \;
. Mengutip &&
( find . -iname \*.csv -exec grep foo {} '&&' echo {} \;
) bypasses itu, tapi sekarang perintah dieksekusi oleh find
adalah sesuatu seperti grep
dengan argumen foo
, wibble.csv
, &&
, echo
dan wibble.csv
. Anda perlu menginstruksikan find
menjalankan shell yang akan menafsirkan &&
operator:
find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;
Perhatikan bahwa argumen pertama setelahnya sh -c SOMECOMMAND
adalah $0
, bukan $1
.
Anda dapat menghemat waktu startup dari proses shell untuk setiap file dengan mengelompokkan doa perintah dengan -exec … +
. Untuk memudahkan pemrosesan, berikan beberapa nilai dummy $0
sehingga "$@"
menyebutkan nama file.
find . -iname \*.csv -exec sh -c 'for x in "$@"; do grep foo "$x" && echo "$x"; done' \ {} +
Jika perintah shell hanya dipisahkan oleh dua program &&
, find
dapat melakukan pekerjaan itu sendiri: tulis dua -exec
tindakan berurutan , dan yang kedua hanya akan dieksekusi jika yang pertama keluar dengan status 0.
find . -iname \*.csv -exec grep foo {} \; -exec echo {} \;
(Saya berasumsi itu grep
dan echo
hanya untuk tujuan ilustrasi, karena -exec echo
dapat digantikan oleh -print
dan output yang dihasilkan tidak terlalu berguna.)
-exec
secara berurutan atau menggunakan satu-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;
.