Karşılaştığınız sorun, kabuğun önce komut satırını ayrıştırması ve &&operatör tarafından ayrılmış iki basit komutu görmesidir :, find . -iname \*.csv -exec grep foo {}ve echo {} \;. Alıntı &&( find . -iname \*.csv -exec grep foo {} '&&' echo {} \;) o atlar, ama şimdi tarafından yürütülen komut findgibi bir şey grepargümanlarla foo, wibble.csv, &&, echove wibble.csv. İşleci findyorumlayacak bir kabuk çalıştırmanız talimatını vermeniz gerekir &&:
find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;
İlk argüman bundan sonra Not sh -c SOMECOMMANDolduğunu $0değil $1.
Komut çağrılarını gruplayarak her bir dosya için bir kabuk işleminin başlangıç zamanından tasarruf edebilirsiniz -exec … +. İşleme kolaylığı için, bazı kukla değerini geçmesi $0, böylece "$@"numaralandırır dosya adları.
find . -iname \*.csv -exec sh -c 'for x in "$@"; do grep foo "$x" && echo "$x"; done' \ {} +
Kabuk komutu sadece iki program ayrılmış ise &&, findkendisi tarafından iş yapabilirsiniz: Yazma iki ardışık -execeylemler ve eğer ikincisi sadece idam edilecek durum 0 ile ilk çıkış.
find . -iname \*.csv -exec grep foo {} \; -exec echo {} \;
(Bunun yerine getirilebileceği gibi sadece örnekleme amaçlı olduğunu grepve sonuçta elde edilen çıktının yine de özellikle yararlı olmadığını kabul ediyorum .)echo-exec echo-print
-execveya bir tane kullanabilirsiniz-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;.