¿Cómo se encuentra? -name * foo * `¿trabajo?

8

Pensé que el comodín *en el comando find . -name *foo*se reemplaza por bash, y sin embargo, el comando funciona a menos que *foo*coincida con algo en el directorio actual, entonces no lo hace. Es confuso.

chx
fuente
3
Nota: Si reemplaza el find . -name *foo*con find . -name '*foo*', permitirá que las coincidencias con comodines funcionen como se esperaba.
Bill

Respuestas:

14

Si bash no puede encontrar una coincidencia, pasa la cadena literal a la aplicación con *s sin expandir. Por ejemplo:

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test *foo*
foo

$ /tmp/test *bar*
*bar*

bashse expandió *foo*porque coincidía, pero pasó *bar*directamente porque no lo hizo. La nullglobopción le dirá a bash que resuelva patrones no coincidentes con la cadena vacía:

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

$
Michael Mrozek
fuente
1
Un pequeño comentario para decir que zsh no tiene el mismo comportamiento predeterminado, se devuelve un error: zsh: no matches found.
Stéphane Gimenez
zsh tiene no_nomatchque desencadenar este comportamiento.
chx
5

Si desea findobtener la cadena sin expandir, puede citarla o proteger los comodines con barras invertidas.

$ ls
foo

$ cat /tmp/test
echo $1

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

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