
私は遭遇しましたこれ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.jpg
れfoo-gallifrey-road-doctors-14437-1366x768.jpg
ます*gall*
。
つまり、コマンドはシェルを通過します(シェルは引用符内のグロブを展開せず、引用符の最も外側の層を取り除きます)。それからまで進みfind
、内部的にパターンを使用してファイル名を照合します。