あなたが直面している問題は、シェルが最初にコマンドラインを解析し、&&演算子で区切られた2つの簡単なコマンドを見るということです:find . -iname \*.csv -exec grep foo {}、およびecho {} \;。引用&&(find . -iname \*.csv -exec grep foo {} '&&' echo {} \;)はこれを迂回するが、今で実行されるコマンドは、findのようなものであるgrepの引数を持つfoo、wibble.csv、&&、echoとwibble.csv。演算子findを解釈するシェルを実行するように指示する必要があります&&。
find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;
後の最初の引数sh -c SOMECOMMANDは$0であることに注意してください$1。
コマンド呼び出しをでグループ化することにより、すべてのファイルのシェルプロセスの起動時間を節約できます-exec … +。処理を簡単にする$0ために"$@"、ファイル名を列挙するようにダミー値を渡します。
find . -iname \*.csv -exec sh -c 'for x in "$@"; do grep foo "$x" && echo "$x"; done' \ {} +
シェルコマンドは、ちょうど2つのプログラムが区切られている場合&&、find書き込み二つの連続:自身で仕事を行うことができます-execアクションを、2つ目は、ステータス0で最初の1が終了した場合に実行されます。
find . -iname \*.csv -exec grep foo {} \; -exec echo {} \;
(私はgrep、これechoは単に説明のための-exec echoもので-printあり、置き換えることができ、結果の出力はとにかく有用ではないと仮定します。)
-execを連続して使用することも、単一のを使用することもできます-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;。