Как `найти. имя * foo * `работа?

8

Я думал, что подстановочный знак *в команде find . -name *foo*заменен на bash, и все же команда работает, если не *foo*совпадает с чем-то в текущем каталоге, тогда это не так. Это сбивает с толку.

СНХ
источник
3
Примечание: Если заменить find . -name *foo*с find . -name '*foo*'ней позволит шаблонные матчи на работу , как и ожидалось.
Билл

Ответы:

14

Если bash не может найти совпадение, он передает литеральную строку приложению с *нерасширенным s. Например:

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test *foo*
foo

$ /tmp/test *bar*
*bar*

bashрасширен, *foo*потому что это соответствует, но прошло *bar*непосредственно, потому что это не так. nullglobОпция указывает Баш разрешить шаблоны несовпадающих пустую строку вместо:

$ shopt -s nullglob
$ /tmp/test *bar*

$
Михаил Мрозек
источник
1
Немного комментариев сказать , что ЗШ не имеет такое же поведение по умолчанию, он возвращает ошибку: zsh: no matches found.
Стефан Гименес
Zsh должен no_nomatchвызвать это поведение.
CHX
5

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

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test '*foo*'
*foo*

$ /tmp/test \*foo\*
*foo*
Кевин М
источник