Como o `encontra. -name * foo * `funciona?

8

Eu pensei que o curinga *no comando find . -name *foo*fosse substituído pelo bash e, no entanto, o comando funcionará, a menos que *foo*corresponda a algo no diretório atual, e não. É confuso.

chx
fonte
3
Nota: Se você substituir o find . -name *foo*por find . -name '*foo*', permitirá que as correspondências curinga funcionem conforme o esperado.
Bill

Respostas:

14

Se o bash não conseguir encontrar uma correspondência, ele passa a string literal para o aplicativo com *s não expandidos. Por exemplo:

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test *foo*
foo

$ /tmp/test *bar*
*bar*

bashexpandiu *foo*porque correspondia, mas passou *bar*diretamente porque não correspondia. A nullglobopção informará ao bash para resolver padrões não correspondentes à sequência vazia:

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

$
Michael Mrozek
fonte
1
Um pequeno comentário para dizer que zsh não tem o mesmo comportamento padrão, ele retorna um erro: zsh: no matches found.
Stéphane Gimenez
O zsh precisa no_nomatchacionar esse comportamento.
chx 24/10
5

Se você deseja findobter a sequência não expandida, pode citá-la ou proteger os curingas com barras invertidas.

$ ls
foo

$ cat /tmp/test
echo $1

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

$ /tmp/test \*foo\*
*foo*
Kevin M
fonte