-exec
コマンドがで終了する必要があります;
(あなたは通常タイプに必要なように、\;
または';'
シェルによって回避さinterpretionに)または+
。違いは、を使用する;
と、コマンドはファイルごとに1 +
回呼び出されます。 。この例を見てください:
$ cat /tmp/echoargs
#!/bin/sh
echo $1 - $2 - $3
$ find /tmp/foo -exec /tmp/echoargs {} \;
/tmp/foo - -
/tmp/foo/one - -
/tmp/foo/two - -
$ find /tmp/foo -exec /tmp/echoargs {} +
/tmp/foo - /tmp/foo/one - /tmp/foo/two
コマンドに2つのエラーがあります:
まず、を使用しますが、は独自のパラメータで{};
ある;
必要があります。
次に、コマンドはで終了します&&
。「検索を実行し、それが成功した場合は、{};
。という名前のファイルを削除します。」-exec
コマンドでシェルを使用する場合は、などのシェルで明示的に実行する必要があります-exec sh -c 'ffmpeg ... && rm'
。
ただし、bashコマンド内に{}を追加しないでください。特殊文字があると問題が発生します。代わりに、後で追加のパラメーターをシェルに渡すことができます-c command_string
(を参照man sh
)。
$ ls
$(echo damn.)
$ find * -exec sh -c 'echo "{}"' \;
damn.
$ find * -exec sh -c 'echo "$1"' - {} \;
$(echo damn.)
$
最初の例ではシェルによって評価されていることがわかります。$(rm -rf /)
:-) というファイルがあると想像してください。
(注意:-
は必要ありませんが、コマンドの後の最初の変数は変数に割り当てられます$0
。これは通常、実行中のプログラムの名前を含む特別な変数であり、パラメーターに設定することは少し不明瞭ですが、ここではおそらく害はないので、それをに設定し-
、で開始し$1
ます。)
したがって、コマンドは次のようになります
find -exec bash -c 'ffmpeg -i "$1" -sameq "$1".mp3 && rm "$1".mp3' - {} \;
しかし、もっと良い方法があります。サポートand
とを見つけるor
ので、あなたはのようなことをするかもしれませんfind -name foo -or -name bar
。しかし-exec
、これはでも機能します。これは、コマンドが正常に終了した場合はtrue、そうでない場合はfalseと評価されます。この例を見てください:
$ ls
false true
$ find * -exec {} \; -and -print
true
コマンドが正常に実行された場合にのみ印刷が実行さtrue
れfalse
ます。
したがって、2つのexecステートメントをとチェーンして使用でき-and
、前者が正常に実行された場合にのみ後者を実行します。