web-dev-qa-db-fra.com

Un comportement étrange pour globbing dans la commande find

In La globulation est-elle une fonctionnalité du shell?

J'ai appris à utiliser Globbing dans la commande find, mais aujourd'hui, j'ai constaté un comportement étrange.

quand je suis n'importe où sauf le lieu de ma recherche, je n'ai pas besoin de guillemets simples ou doubles pour effectuer une recherche globale

$ pwd
/home
$ find / -name *c
...
it is ok

mais

$ pwd
/
$ find / -name *c
find: paths must precede expression: proc
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Qu'est-ce qui se passe?

2
Sinoosh

Lorsque vous utilisez * sans signe (ou un caractère d’échappement) _ c'est-à-dire un jeton global * (un nombre quelconque de caractères, c’est-à-dire n’importe quel fichier), le shell étend * à tous les fichiers du répertoire donné, dans cas de *c, tous les fichiers se terminant par c. Alors quand tu cours:

find / -name *c

en supposant qu'il y a trois fichiers .c dans le répertoire actuel, à savoir foo.c, bar.c et spam.c, la commande serait exécutée comme suit:

 find / -name foo.c bar.c spam.c

ce qui est une commande invalide, comme vous pouvez le voir, il utilise plusieurs noms de fichiers après la seule option -name. C'est ce qui se passe lorsque vous êtes à /.

Maintenant, bien qu’à /home, il n’y avait vraisemblablement pas de fichiers *c, le motif global *c sera donc conservé (dans bash, il s’agit du comportement dépendant de Shell; dans bash, vous pouvez modifier le comportement par défaut de nullglob/failglob Options du shell). La commande find gets est donc:

 find / -name *c

qui est une commande valide et en cours d’exécution.


Maintenant, avec find, vous devriez citer ou échapper tout jeton de globalisation du shell, car vous souhaitez que find interprète (développe) ceux-ci, pas au préalable par le Shell. Alors faites l'un des:

find / -name '*c'
find / -name "*c"
find / -name \*c
11
heemayl