ワイルドカードに二重引用符または引用符なしを使用する

ワイルドカードに二重引用符または引用符なしを使用する

私は遭遇しましたこれ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 に一致するファイルが 2 つ以上ある場合、find コマンドは不正な形式になり、エラーで終了するだけだと思います。

ケースAの場合:

find . -iname "*gall*"

引用符があるため、シェルしませんパターンを展開します。これは次のようになります (これがfind見えるものです):

find . -iname *gall*

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

つまり、コマンドはシェルを通過します(シェルは引用符内のグロブを展開せず、引用符の最も外側の層を取り除きます)。それからまで進みfind、内部的にパターンを使用してファイル名を照合します。

関連情報