ワイルドカードで二重引用符を使用するか、引用符なしで使用してください。

ワイルドカードで二重引用符を使用するか、引用符なしで使用してください。

私は偶然会ったこれこの記事では、findコマンドを説明しようとしています。それは例です。

find /tmp -iname "data*.txt"

今この記事ここ指摘

二重引用符は、「$」で始まる単語の置換を抑制しません。ただし、ワイルドカード拡張は抑制されます。

これら2つのコマンドを試してみると

admin@localhost Downloads$ ls
gallifrey-road-doctors-14437-1366x768.jpg  mydir
admin@localhost Downloads$ find . -iname "*gall*"
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$ find . -iname "*gall*"  -----> A
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$ find . -iname *gall*    -----> B
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$

出力は同じようです。どのような状況で違いますか?二重引用符がワイルドカード拡張を抑制しないのはなぜですかA?私の考えでは、Aは動作せず、Bだけが動作するようです。

答え1

ケースB:

find . -iname *gall*

これシェル*gall*パターンに一致するすべてのファイルのリストに展開されます。現在のディレクトリには、このパターンに一致するファイルが1つしかないため、次のようになります。

find . -iname gallifrey-road-doctors-14437-1366x768.jpg

...それで、findは正しい名前と一致するファイルを検索します。foo-gallifrey-road-doctors-14437-1366x768.jpg見つかりません。 globに一致するファイルが複数ある場合は、誤ったfindコマンドが実行され、エラーで終了することが保証されます。

ケースA:

find . -iname "*gall*"

引用符によるシェルに慣れるパターンを展開してください。これは次のとおりです(find表示される内容は次のとおりです)。

find . -iname *gall*

その後、パターンはfindコマンドでパターンと一致するすべてのファイル(およびディレクトリなど)を検索するために使用されます。gallifrey-road-doctors-14437-1366x768.jpgパターンにfoo-gallifrey-road-doctors-14437-1366x768.jpg一致するすべてのファイルを見つけます*gall*

したがって、コマンドはシェルを通過します(引用符内のグローバルを拡張せずに一番外側の引用符を削除します)。それからを通過しながら、find内部的にパターンを使用してファイル名を一致させます。

関連情報