web-dev-qa-db-ja.com

findコマンドの-execオプションでバックスラッシュとセミコロンが必要なのはなぜですか?

Linuxターミナルでさまざまなコマンドを組み合わせ始めました。次のようなコマンドにバックスラッシュとセミコロンが必要なのはなぜかと思っています。

find ./ -name 'blabla' -exec cp {} ./test \;

単純なcpコマンドが単純な場合:

cp randomfile ./test

\なし

コマンドの終わりを明確に示しているのですか、それとも単にドキュメントで必要ですか?根本的な原則は何ですか?

ありがとうございました!

55
wesk

;は、シェルコマンドを区切るためのリスト演算子(または&&||)の1つであるため、セミコロンの前のバックスラッシュが使用されます。例:

command1; command2

findユーティリティは、;または+を使用して、-execによって呼び出されたシェルコマンドを終了します。

そのため、シェルの特殊文字が解釈されないようにするには、バックスラッシュでエスケープし、次の文字の読み取りと行継続のための特別な意味を削除する必要があります。

したがって、findコマンドには次の構文例を使用できます。

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

こちらもご覧ください:

42
kenorb

「man find」から:

Findに続くすべての引数は、 ';'で構成される引数までコマンドの引数と見なされます遭遇します。

findは、execの引数がいつ終了するかを知る必要があります。シェルコマンドを;で終了するのは自然です。シェルもこの文字を使用するためです。まったく同じ理由で、シェルを介して挿入される場合、そのような文字はエスケープする必要があります。

49