構文は次のとおりです。
find ... -exec cmd {} +
find
コマンドの引数のサイズの制限を超えない範囲で、ファイルパスのリストを引数として...
実行cmd
して、条件に基づいて多数のファイルを検索します。
必要に応じて、ファイルのリストを分割し、cmd
数回呼び出すことがあります。たとえば、次の呼び出しが発生する場合があります。
cmd ./file1 ./file2 ... ./file3000
cmd ./file3001 ./file3002 ... ./file4321
それに関する制限は、それが{}
最後でなければならないということです。たとえば、次のように書くことはできません。
find ... -exec cmd {} other args +
の';'
代わりにあなたができるように'+'
。
あなたは書ける:
find ... -exec echo foo {} +
だがしかし:
find ... -exec echo {} foo +
したがって、cmd
ファイルのリストの後に引数を追加する必要がある場合は、シェルを呼び出す必要があります。(シェルを呼び出す必要がある他の理由は、リダイレクト、パイプ、一部の文字列展開などのシェル機能を使用する必要があるときです。)
sh -c 'inline-script' x a b c
のためにinline-script
、$0
されてx
、$1
あるa
、$2
あるb
...ので、"$@"
a、bおよびc:それらの3つの引数のリストです。だから:
find ... -exec sh -c 'cmd "$@" other arg' find-sh {} +
以下のためにインラインスクリプト、$0
(エラーメッセージを表示する際に、インスタンスのために使用されている)に設定されているfind-sh
し、"$@"
(どのようなファイルのリストでfind
展開さ{}
に)。
exec
シェルの特別な組み込みを使用することにより:
find ... -exec sh -c 'exec cmd "$@" other arg' find-sh {} +
実行する余分なプロセスをforkするのではcmd
なく、同じプロセスで実行するようにシェルに指示します(実行中のシェルプロセスをそのコマンドで置き換えます)。のような一部のシェルbash
、zsh
およびの一部の実装はksh
、スクリプトの最後のコマンドに対して暗黙的にそれを実行します。
-exec sh -c '(cmd1; cmd2;)' find-sh {} +
?