Comment `trouve. -name * foo * `fonctionne?

8

Je pensais que le caractère générique *dans la commande find . -name *foo*était remplacé par bash, et pourtant la commande fonctionne à moins qu'elle ne *foo*corresponde à quelque chose dans le répertoire courant, alors ce n'est pas le cas. C'est confu.

chx
la source
3
Remarque: Si vous remplacez le find . -name *foo*par, find . -name '*foo*'cela permettra aux correspondances génériques de fonctionner comme prévu.
Bill

Réponses:

14

Si bash ne trouve pas de correspondance, il transmet la chaîne littérale à l'application avec *s non développé. Par exemple:

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test *foo*
foo

$ /tmp/test *bar*
*bar*

bashdéveloppé *foo*parce qu'il correspond, mais passé *bar*directement parce qu'il ne l'a pas fait. L' nullgloboption indiquera à bash de résoudre les modèles non correspondants à la chaîne vide à la place:

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

$
Michael Mrozek
la source
1
Un petit commentaire pour dire que zsh n'a pas le même comportement par défaut, il renvoie une erreur: zsh: no matches found.
Stéphane Gimenez
zsh doit no_nomatchdéclencher ce comportement.
chx
5

Si vous souhaitez findobtenir la chaîne non développée, vous pouvez la citer ou protéger les caractères génériques avec des barres obliques inverses.

$ ls
foo

$ cat /tmp/test
echo $1

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

$ /tmp/test \*foo\*
*foo*
Kevin M
la source