web-dev-qa-db-ja.com

「{} \;」とは何ですかLinuxコマンドの意味?

時々、次のコマンドが表示されます。

find . -name  * -exec ls -a {} \;

私はこれを実行するように頼まれました。

ここで{} \;はどういう意味ですか?

36
codeofnode

findexecを実行すると、{}は、findで見つかった各ファイルまたはディレクトリのファイル名に展開されます(したがって、例のlsは引数としてのファイル名-ls、または見つかったファイルごとに指定した他のコマンドを呼び出すことに注意してください)。

セミコロン;は、execによって実行されたコマンドを終了します。内部でfindを実行するシェルがそれを独自の特殊文字として扱わず、findに渡すように、\でエスケープする必要があります。

詳細については この記事 をご覧ください。


また、findexec cmd {} +で最適化を提供します-そのように実行すると、findはファイルごとに1回呼び出すのではなく、見つかったファイルをコマンドの最後に追加します(コマンドが実行されるように)可能であれば1回のみ)。

lsを指定して実行した場合、動作の違い(効率に違いがない場合)は簡単にわかります。

find ~ -iname '*.jpg' -exec ls {} \;
# vs
find ~ -iname '*.jpg' -exec ls {} +

いくつかのjpgファイル(十分に短いパス)があると仮定すると、結果は、最初のケースではファイルごとに1行で、標準のls後者の列にファイルを表示する動作。

46
moon.musick

findコマンドのマンページから Manpage icon

-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.txtcat file2.txtなどです。

20
Alaa Ali