
Я наткнулся наэтотстатья, в которой делается попытка объяснить команду find. В ней приводится пример
find /tmp -iname "data*.txt"
теперь эта статьяздесьговорится, что
Двойные кавычки не подавляют замену слов, начинающихся с «$».но они подавляют расширение подстановочных знаков.
Также, когда я попробовал две команды
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
В случае Б:
find . -iname *gall*
Theоболочкабудет развернут *gall*
в список всех файлов, соответствующих этому шаблону. Поскольку в вашем текущем каталоге есть только один файл, соответствующий этому шаблону, это становится:
find . -iname gallifrey-road-doctors-14437-1366x768.jpg
...так что find будет искать файлы, соответствующие этому точному имени. foo-gallifrey-road-doctors-14437-1366x768.jpg
не будет найден. Если у вас было два или более файлов, соответствующих glob, вы бы получили неправильно сформированную команду find; я почти уверен, что она бы просто завершилась с ошибкой.
В случае А:
find . -iname "*gall*"
Из-за кавычек оболочкане будетРасширьте шаблон. Это просто становится (это то, что find
видит):
find . -iname *gall*
После этого команда find использует этот шаблон для поиска всех файлов (и каталогов и т. д.), соответствующих этому шаблону. Это найдет gallifrey-road-doctors-14437-1366x768.jpg
и foo-gallifrey-road-doctors-14437-1366x768.jpg
и каждый файл, соответствующий шаблону *gall*
.
Итак: ваша команда проходит через оболочку (которая не расширяет шаблоны внутри кавычек и удаляет внешний слой кавычек), изатемпроходит через find
, который внутренне использует шаблон для сопоставления имен файлов.