検索コマンドで「{} \;」とはどういう意味ですか?


38

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

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

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

何がない{} \;ここに意味ですか?


2
-name *冗長です。
ケビン

3
また、このような他のタイプの質問についてはexplainshellをチェックしください。コマンドの出力は次のとおりです。
グルタニメート

10
-name *冗長よりも悪いです。*は引用符で囲まれていないため、シェルはそれを現在のフォルダー内のファイル名のリストに展開し、スペースが正しく処理されず、予期しない結果またはエラーメッセージが表示されます。余分なポイントとして、find多くの機能があり、そのうちの1つはファイルをリストすることです。これにより、を使用する必要がなくなります-exec。たとえば、find . -printまたはを使用できますfind . -ls。最後に、セミコロンをエスケープする方法は2つあります。バックスラッシュを使用した場合と同様に、\;引用符を使用する方法です';'。あなたがより快適に感じるものを使用してください。
水田ランダウ

回答:


49

で実行するfindexec{}見つかった各ファイルまたはディレクトリのファイル名に展開されます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、後者の場合は列にファイルを表示する標準的な動作になります。


1
私はあなたが対比することは有益であろうと思います\;+
ケビン

それとどう違うのfind . -name * | ls -a -
アンドラスハマー

@DrHポイントは、シェルにワイルドカード展開を行わせず、ワイルドカード式をに渡すことfindです。また、出力のlsこのケースでは、明らかに、入力に依存しない-私はのためのフィルタとして使用しているものに関係なくはfindls単に作業ディレクトリの内容を表示し、それがすべてです。例find ~ -iname '*.jpg' -exec ls -a {} \;vsを確認してくださいfind ~ -iname '*.jpg' | ls -a
moon.musick

@DrHまたはecho 'foo' | ls -a
moon.musick

@ moon.musick、@ dr-hのクエリをテストする際-に、ls -a -コマンドの重要性を見逃したと思います。
ダニエルLlewellyn

21

コマンドマンページfindマンページアイコンから:

-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コマンドが検索する各ファイルのプレースホルダーです(ここから取得)。

その\;部分は基本的にfind「大丈夫、実行したいコマンドで終わりました」と言っています。

例:

.txtファイルがいっぱいのディレクトリにいるとしましょう。次に実行します:

find . -name  '*.txt' -exec cat {} \;

最初の部分find . -name *.txtは、.txtファイルのリストを返します。第二部では、-exec cat {} \;実行されますcatで見つかったすべてのファイルに対してコマンドをfindそう、cat file1.txtcat file2.txt、など。


4
部分*.txtはとして引用する必要があります'*.txt'。これは.txt、現在のフォルダーにファイルがある場合、シェルがこれを展開し、誤った結果またはエラーメッセージが表示されるためです。find -name '*.txt' -exec cat {} \;
水田ランダウ

@Alaaアリ非常によく説明
プーシャ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.