あなたが直面している問題は、シェルが最初にコマンドラインを解析し、&&
演算子で区切られた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"' {} \;
。