時々、次のコマンドが表示されます。
find . -name * -exec ls -a {} \;
私はこれを実行するように頼まれました。
ここで{} \;
はどういう意味ですか?
find
でexec
を実行すると、{}
は、find
で見つかった各ファイルまたはディレクトリのファイル名に展開されます(したがって、例のls
は引数としてのファイル名-ls
、または見つかったファイルごとに指定した他のコマンドを呼び出すことに注意してください)。
セミコロン;
は、exec
によって実行されたコマンドを終了します。内部でfind
を実行するシェルがそれを独自の特殊文字として扱わず、find
に渡すように、\
でエスケープする必要があります。
詳細については この記事 をご覧ください。
また、find
はexec cmd {} +
で最適化を提供します-そのように実行すると、find
はファイルごとに1回呼び出すのではなく、見つかったファイルをコマンドの最後に追加します(コマンドが実行されるように)可能であれば1回のみ)。
ls
を指定して実行した場合、動作の違い(効率に違いがない場合)は簡単にわかります。
find ~ -iname '*.jpg' -exec ls {} \;
# vs
find ~ -iname '*.jpg' -exec ls {} +
いくつかのjpg
ファイル(十分に短いパス)があると仮定すると、結果は、最初のケースではファイルごとに1行で、標準のls
後者の列にファイルを表示する動作。
-exec command ;
Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to
the command until an argument consisting of `;' is encountered. The string `{}' is replaced by the current
file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it
is alone, as in some versions of find. Both of these constructions might need to be escaped (with a `\') or
quoted to protect them from expansion by the Shell.
だからここに説明があります:
{}
は、「find
の出力」を意味します。例えば、「find
が見つかったものは何でも」。 find
は、探しているファイルのパスを返します。したがって、{}
で置き換えられます。 find
コマンドが検索する各ファイルのプレースホルダーです( here から取得)。
\;
部分は基本的にfind
を「大丈夫、実行したいコマンドで終わりました」と言っています。
.txt
ファイルでいっぱいのディレクトリにいるとしましょう。次に実行します:
find . -name '*.txt' -exec cat {} \;
最初の部分find . -name *.txt
は、.txt
ファイルのリストを返します。 2番目の部分-exec cat {} \;
は、cat
によって検出されたすべてのファイルに対してfind
コマンドを実行します。したがって、cat file1.txt
、cat file2.txt
などです。