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 findso etwas wie grepmit den Argumenten foo, wibble.csv, &&, echound 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 SOMECOMMANDist $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 &&, findkann der Job von selbst ausgeführt werden: Schreiben Sie zwei aufeinanderfolgende -execAktionen, 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 grepund echonur zu Illustrationszwecken dienen, da -exec echodiese durch ersetzt werden können -printund die resultierende Ausgabe ohnehin nicht besonders nützlich ist.)
-execnacheinander oder ein einzelnes verwenden-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;.