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 find
gibi bir şey grep
argümanlarla foo
, wibble.csv
, &&
, echo
ve wibble.csv
. İşleci find
yorumlayacak 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 SOMECOMMAND
olduğunu $0
değ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 &&
, find
kendisi tarafından iş yapabilirsiniz: Yazma iki ardışık -exec
eylemler 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 grep
ve sonuçta elde edilen çıktının yine de özellikle yararlı olmadığını kabul ediyorum .)echo
-exec echo
-print
-exec
veya bir tane kullanabilirsiniz-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;
.