301 votes

"find : paths must precede expression :" Comment puis-je spécifier une recherche récursive qui trouve également les fichiers dans le répertoire actuel ?

J'ai du mal à obtenir trouver pour rechercher des correspondances dans le répertoire courant ainsi que dans ses sous-répertoires.

Quand je cours find *test.c il ne me donne que les correspondances dans le répertoire actuel. (ne regarde pas dans les sous-répertoires)

Si j'essaie find . -name *test.c Je m'attendrais à obtenir les mêmes résultats, mais au lieu de cela, je n'obtiens que les correspondances qui se trouvent dans un sous-répertoire. Quand il y a des fichiers qui devraient correspondre dans le répertoire de travail, il me donne : find: paths must precede expression: mytest.c

Que signifie cette erreur, et comment puis-je obtenir les correspondances à la fois dans le répertoire actuel et dans ses sous-répertoires ?

8 votes

Pour le compte rendu, find de msysgit peut provoquer cette erreur si vous n'entourez pas le motif de guillemets : find . -name "*test.c" . (Au cas où vous choisiriez de le préférer aux différentes options de Windows). find.exe et utiliser à partir de cmd)

496voto

Chris J Points 12904

Essayez de le mettre entre guillemets - vous vous heurtez à l'expansion des caractères génériques de l'interpréteur de commandes, donc ce que vous passez normalement pour trouver ressemblera à ceci :

find . -name bobtest.c cattest.c snowtest.c

...causant l'erreur de syntaxe. Essayez plutôt ceci :

find . -name '*test.c'

Notez les guillemets simples autour de votre expression de fichier -- ils empêcheront l'interpréteur de commandes (bash) d'étendre vos caractères de remplacement.

16 votes

A titre d'exemple, vous pouvez voir ce qui se passe si vous faites echo *test.c ... le résultat ne sera pas echo qui développe le joker, mais le shell lui-même. La leçon simple est que si vous utilisez des jokers, citez le fichier :-)

0 votes

Merci de m'avoir aidé avec ce VARIANT. J'ai essayé find . -type f -printf ‘%TY-%Tm-%Td %TT %p\n’ tel qu'il a été trouvé sur le web, et on lui a répondu "les chemins doivent précéder l'expression". Le problème était que les guillemets étaient trop "intelligents". J'ai retapé la commande, en remplaçant les guillemets, et ça a marché.

2 votes

Pour une raison quelconque, les guillemets simples ne fonctionnent pas pour moi. J'ai dû utiliser des guillemets doubles. ¯ \_ ()_/¯

35voto

Jim Garrison Points 39523

Ce qui se passe, c'est que le shell développe "*test.c" en une liste de fichiers. Essayez d'échapper l'astérisque comme :

find . -name \*test.c

1 votes

gitbash c'était la solution pour moi avec git bash sur Windows, même en citant le PATTERN find . -name '*txt'

26voto

Nick Constantine Points 334

De trouver le manuel :

NON-BUGS         

   Operator precedence surprises
   The command find . -name afile -o -name bfile -print will never print
   afile because this is actually equivalent to find . -name afile -o \(
   -name bfile -a -print \).  Remember that the precedence of -a is
   higher than that of -o and when there is no operator specified
   between tests, -a is assumed.

   “paths must precede expression” error message
   $ find . -name *.c -print
   find: paths must precede expression
   Usage: find [-H] [-L] [-P] [-Olevel] [-D ... [path...] [expression]

   This happens because *.c has been expanded by the shell resulting in
   find actually receiving a command line like this:
   find . -name frcode.c locate.c word_io.c -print
   That command is of course not going to work.  Instead of doing things
   this way, you should enclose the pattern in quotes or escape the
   wildcard:
   $ find . -name '*.c' -print
   $ find . -name \*.c -print

22voto

rkulla Points 1451

Essayez de le mettre entre guillemets :

find . -name '*test.c'

8voto

cell-in Points 352

Je vois que cette question a déjà reçu une réponse. Je veux juste partager ce qui a fonctionné pour moi. Il manquait un espace entre ( y -name . La façon correcte de choisir un fichier en excluant certains d'entre eux serait donc la suivante ;

find . -name 'my-file-*' -type f -not \( -name 'my-file-1.2.0.jar' -or -name 'my-file.jar' \)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X