2012-10-05 2 views
5

J'utilise zsh englobement pour des commandes telles que:pourquoi zsh globbing ne fonctionne pas avec la commande find?

vim **/filename 
vim *.html.erb 

et ainsi de suite, mais quand je tape quelque chose comme:

find . -name *mobile* 

Je reçois la réponse:

zsh: no matches found: *mobile* 

Pourquoi?

+0

Je pense qu'il a une meilleure réponse ici: https://unix.stackexchange.com/questions/130958/scp-wildcard-not-working-in-zsh – sttaq

Répondre

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

vs

find . -name '*mobile*' # works 

La différence est due aux étapes que l'enveloppe prend lorsqu'il analyse d'une ligne. Normalement, l'interpréteur de commandes développe tous les caractères génériques qu'il trouve avant d'exécuter la commande. Cependant, les guillemets simples marquent l'argument comme étant un littéral, ce qui signifie que le shell ne préforme pas l'expansion générique sur cet argument avant d'exécuter la commande.

Pour démontrer la différence, supposons que vous êtes dans un répertoire avec les fichiers suivants:

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

zsh étendra la première forme à ce qui suit avant de l'exécuter:

find . -name mobile.1 

Ce qui signifie que trouver regardera seulement les fichiers nommés littéralement mobile.1

La deuxième forme sera gérée comme suit:

find . -name *mobile* 

Cela signifie que find recherchera tout nom de fichier contenant la chaîne "mobile".

La chose importante à noter ici est que zsh et find supportent la même syntaxe générique, mais vous voulez trouver à gérer les caractères génériques dans ce cas, pas zsh.

1

avère que tout ce que vous avez à faire pour résoudre le problème est d'ajouter des guillemets autour de l'entrée:

find . -name '*mobile*' 

Je n'ai pas vraiment une réponse à pourquoi tout de suite ... et la documentation n'a pas quelque chose qui me dépasse, mais faites le moi savoir si vous connaissez la réponse!

Questions connexes