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 findadalah sesuatu seperti grepdengan argumen foo, wibble.csv, &&, echodan wibble.csv. Anda perlu menginstruksikan findmenjalankan shell yang akan menafsirkan &&operator:
find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;
Perhatikan bahwa argumen pertama setelahnya sh -c SOMECOMMANDadalah $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 $0sehingga "$@"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 &&, finddapat melakukan pekerjaan itu sendiri: tulis dua -exectindakan 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 grepdan echohanya untuk tujuan ilustrasi, karena -exec echodapat digantikan oleh -printdan output yang dihasilkan tidak terlalu berguna.)
-execsecara berurutan atau menggunakan satu-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;.