web-dev-qa-db-fra.com

"find: les chemins doivent précéder expression:" Comment spécifier une recherche récursive qui trouve également des fichiers dans le répertoire actuel?

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

Lorsque je lance find *test.c, il ne me donne que les correspondances du répertoire en cours. (ne regarde pas dans les sous-répertoires)

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

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

220
Chris Finley

Essayez de mettre entre guillemets - vous rencontrez le développement de joker, alors ce que vous êtes en train de passer à trouver ressemblera à ceci:

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

... causant l'erreur de syntaxe. Alors essayez ceci à la place:

find . -name '*test.c'

Notez les guillemets simples autour de votre expression de fichier - ils empêcheront le shell (bash) de développer vos caractères génériques.

369
Chris J

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

find . -name \*test.c
27
Jim Garrison

Essayez de le mettre entre guillemets:

find . -name '*test.c'
15
rkulla

De trouver 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
10
Nick Constantine

Je suis tombé sur cette question lorsque j'essayais de trouver plusieurs noms de fichiers que je ne pouvais pas combiner dans une expression régulière comme décrit dans la réponse de @Chris J, voici ce qui a fonctionné pour moi

find . -name one.pdf -o -name two.txt -o -name anotherone.jpg

-o ou -or est un OU logique. Voir Recherche de fichiers sur Gnu.org pour plus d'informations.

Je courais ceci sur CygWin.

0
HappyTown

Dans mon cas, il me manquait la fin / dans le chemin.

find /var/opt/gitlab/backups/ -name *.tar
0
Vikash Singh