2012-10-05 68 views
5

He estado usando zsh comodines para comandos como:¿por qué zsh globbing no funciona con el comando find?

vim **/filename 
vim *.html.erb 

y así sucesivamente, pero cuando escribo en algo así como:

find . -name *mobile* 

Me da la respuesta:

zsh: no matches found: *mobile* 

¿Por qué?

+0

Creo que tiene una mejor respuesta aquí: https://unix.stackexchange.com/questions/130958/scp-wildcard-not-working-in-zsh – sttaq

Respuesta

29
find . -name *mobile* # does not work 

vs

find . -name '*mobile*' # works 

La diferencia se debe a los pasos que la cáscara toma cuando se analiza una línea. Normalmente, el shell expande cualquier comodín que encuentre antes de ejecutar el comando. Sin embargo, las comillas simples marcan el argumento como literal, lo que significa que el shell no preforma la expansión del comodín en ese argumento antes de ejecutar el comando.

Para demostrar la diferencia, supongamos que usted está en un directorio con los siguientes archivos:

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

zsh ampliará la primera forma a la siguiente antes de ejecutarlo:

find . -name mobile.1 

Lo que significa que buscar solo buscará archivos llamados literalmente mobile.1

El segundo formulario se ejecutará de la siguiente manera:

find . -name *mobile* 

Lo que significa que find buscará cualquier nombre de archivo que contenga la cadena "mobile".

Lo importante a tener en cuenta aquí es que tanto zsh como find admiten la misma sintaxis de comodín, pero en este caso, debe buscar manejar los comodines, no zsh.

1

Resulta que todo lo que tiene que hacer para resolver el problema es añadir algunas citas alrededor de la entrada:

find . -name '*mobile*' 

Realmente no tengo una respuesta de por qué todavía ... y la documentación no tiene algo que sobresalga en mí, pero avíseme si conoce la respuesta.

Cuestiones relacionadas