`find`でアスタリスクの前にバックスラッシュを付けるのはなぜですか?


9

このコマンドでは:

find . -name \*.pyc -delete

以前にバックスラッシュが必要なのはなぜ*.pycですか?


のmanページにfindNON-BUGS、例と同様のもので呼び出されるセクションと、それが必要な理由の説明が必要です。
ブライアン

回答:


19

引用符で囲まれていないグロブfindは、実行される前にシェルによって展開されます。(マニュアルのファイル名拡張を参照してください。)

そう言って:

find . -name *.pyc -delete

実際に実行されます:

find . -name file1.pyc file2.pyc file3.pyc -delete

現在のディレクトリに3つの.pycファイルがあり、代わりにエラーが発生すると仮定します。

バックスラッシュを使用すると、シェルはグロブをfindに渡し*.pycます。つまり、引用符のように動作します。

理想的には、グロブを引用する必要があります:

find . -name '*.pyc' -delete

@RamRachum、ただし入力時に文字が増えます。
Paul Draper 2014

1
@PaulDraper読みやすく、間違いを起こしにくい> 1回のキーストロークで短縮
ドアノブ2014

一重引用符は行く方法です。私はあなたがこのようにバックスラッシュを使うことができるとは思っていませんでした...
フロリス

4

シェルがfindコマンドを発行する前に、さまざまな展開が行われます。そうすることで*、ワイルドカード(グロビング文字)である特殊文字(または特殊な意味を持つ文字)も処理します。これは、いわゆるファイル名の展開です。

ディレクトリに2つのファイルがあるとします。

  • foo.pyc
  • bar.pyc

その後*.pyc、両方の名前に展開されます。だからあなたが書くなら:

find . -name *.pyc -delete

その後、シェルは実際に次を呼び出します:

find . -name foo.pyc bar.pyc -delete

に対しては1つの引数しか持てないため、これはあまり意味がありません-name。そのため、シェルによって解釈されないように特殊文字をエスケープする必要があります。これは、バックスラッシュエスケープ、または引用符で囲みます。

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