почему zsh globbing не работает с командой find?

Я использую zsh globbing для таких команд, как:

 vim **/filename
 vim *.html.erb

и так далее, но когда я набираю что-то типа:

 find . -name *mobile*

Я получаю ответ:

 zsh: no matches found: *mobile*

почему?

2 ответов


find . -name *mobile* # does not work

vs

find . -name '*mobile*' # works

разница связана с шагами, которые оболочка принимает, когда она анализирует строку. Обычно оболочка разворачивает все подстановочные знаки, которые она находит перед запуском команды. Однако одинарные кавычки помечают аргумент как литерал, что означает, что оболочка не формирует расширение подстановочного знака для этого аргумента перед запуском команды.

чтобы продемонстрировать разницу, предположим, что вы находитесь в каталоге со следующим файлы:

$ tree
./
mobile.1
dir/
    mobile.2

zsh развернет первую форму следующим образом перед ее запуском:

find . -name mobile.1

это означает, что find будет искать только файлы с именем буквально mobile.1

вторая форма будет выглядеть следующим образом:

find . -name *mobile*

что означает, что find будет искать любое имя файла, содержащее строку "mobile".

важно отметить, что zsh и find поддерживают один и тот же синтаксис подстановочных знаков, но вы хотите найти в этом случае обрабатывайте подстановочные знаки, а не zsh.


оказывается, что все, что вам нужно сделать, чтобы решить проблему, это добавить несколько кавычек вокруг ввода:

find . -name '*mobile*'

У меня пока нет ответа на вопрос, почему...и в документации нет чего-то, что торчит для меня, но дайте мне знать, если вы знаете ответ!