Das Problem, mit dem Sie konfrontiert sind, besteht darin, dass die Shell zuerst die Befehlszeile analysiert und zwei einfache Befehle sieht, die vom &&
Operator getrennt werden :, find . -iname \*.csv -exec grep foo {}
und echo {} \;
. Zitiert &&
( find . -iname \*.csv -exec grep foo {} '&&' echo {} \;
) umgeht das, aber jetzt der Befehl ausgeführt durch find
so etwas wie grep
mit den Argumenten foo
, wibble.csv
, &&
, echo
und wibble.csv
. Sie müssen anweisen find
, eine Shell auszuführen, die den &&
Operator interpretiert :
find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;
Beachten Sie, dass das erste Argument nach sh -c SOMECOMMAND
ist $0
, nicht $1
.
Sie können die Startzeit eines Shell-Prozesses für jede Datei speichern, indem Sie die Befehlsaufrufe mit gruppieren -exec … +
. Übergeben Sie zur Vereinfachung der Verarbeitung einen Dummy-Wert $0
, um "$@"
die Dateinamen aufzulisten.
find . -iname \*.csv -exec sh -c 'for x in "$@"; do grep foo "$x" && echo "$x"; done' \ {} +
Wenn der Shell-Befehl nur aus zwei durch getrennten Programmen besteht &&
, find
kann der Job von selbst ausgeführt werden: Schreiben Sie zwei aufeinanderfolgende -exec
Aktionen, und die zweite wird nur ausgeführt, wenn die erste mit dem Status 0 beendet wird.
find . -iname \*.csv -exec grep foo {} \; -exec echo {} \;
(Ich gehe davon aus, dass grep
und echo
nur zu Illustrationszwecken dienen, da -exec echo
diese durch ersetzt werden können -print
und die resultierende Ausgabe ohnehin nicht besonders nützlich ist.)
-exec
nacheinander oder ein einzelnes verwenden-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;
.