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

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

Quand j'exécute find *test.c Il me donne seulement les correspondances dans le répertoire courant. (ne regarde pas dans les sous-répertoires)

Si j'essaie find . -name *test.c Je m'attendrais aux mêmes résultats, mais à la place cela ne me donne que des correspondances qui sont 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 courant et de ses sous-répertoires?

195
demandé sur Chris Finley 2011-06-27 19:51:34

4 réponses

Essayez de le mettre entre guillemets - vous rencontrez l'extension générique du shell, donc ce que vous passez à trouver ressemblera à:

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

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

find . -name '*test.c'

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

331
répondu Chris J 2011-06-27 15:54:56

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

find . -name \*test.c
24
répondu Jim Garrison 2011-06-27 15:55:05

Essayez de le mettre entre guillemets:

find . -name '*test.c'
12
répondu rkulla 2011-06-27 15:54:52

Du manuel de recherche:

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
8
répondu Nick Constantine 2016-11-29 21:29:14