からman find
:
-execコマンド;
コマンドを実行します。0ステータスが返された場合はtrue。次のfindの引数はすべて、「;」で構成される引数まで、コマンドの引数と見なされます。遭遇した。文字列 '{}'は、findの一部のバージョンのように、それが単独の引数だけでなく、コマンドの引数で発生するすべての場所で処理されている現在のファイル名に置き換えられます。これらの構造は両方とも、シェルによる拡張から保護するために、エスケープ(「\」を使用)または引用符で囲む必要がある場合があります。「-exec」オプションの使用例については、使用例のセクションを参照してください。指定されたコマンドは、一致したファイルごとに1回実行されます。
コマンドは、開始ディレクトリで実行されます。-execオプションの使用に関する避けられないセキュリティ問題があります。
-execコマンド{} +
この-execオプションのバリアントは、選択されたファイルに対して指定されたコマンドを実行しますが、コマンドラインは、選択された各ファイル名を末尾に追加することによって構築されます。コマンドの呼び出しの総数は、一致したファイルの数よりもはるかに少なくなります。コマンドラインは、xargsがコマンドラインをビルドするのとほぼ同じ方法でビルドされます。コマンド内では、 '{}'のインスタンスを1つだけ使用できます。コマンドは、開始ディレクトリで実行されます。
だから、私はそれを理解する方法は、\;
で見つかった各ファイルに対して別々のコマンドを実行しfind
、一方、\+
ファイルを追加し、それらのすべてに単一のコマンドを実行します。\
それはですので、エスケープ文字であります:
ls testdir1; ls testdir2
対
ls testdir1 testdir2
私のシェルで上記を行うと、質問の出力がミラーリングされました。
使用したい場合の例 \+
2つのファイルがある1.tmp
とし2.tmp
ます。
1.tmp:
1
2
3
2.tmp:
0
2
3
と\;
:
find *.tmp -exec diff {} \;
> diff: missing operand after `1.tmp'
> diff: Try `diff --help' for more information.
> diff: missing operand after `2.tmp'
> diff: Try `diff --help' for more information.
一方、\+
(の結果を連結するため)を使用する場合find
:
find *.tmp -exec diff {} \+
1c1,3
< 1
---
> 0
> 2
> 30
したがって、この場合にはそれが違いだdiff 1.tmp; diff 2.tmp
とdiff 1.tmp 2.tmp
\;
適切\+
で必要な場合があります。\+
withの使用rm
はそのようなインスタンスの1つであり、多数のファイルを削除する場合、パフォーマンス(速度)はよりも優れてい\;
ます。