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

235

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

Lorsque je lance, find *test.cil ne me donne que les correspondances dans le répertoire courant. (ne regarde pas dans les sous-répertoires)

Si j'essaye, find . -name *test.cje m'attendrais aux mêmes résultats, mais à la place, cela ne me donne que des correspondances qui se trouvent dans un sous-répertoire. Lorsqu'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?

Chris Finley
la source
4
pour l'enregistrement, findde msysgit peut jeter cette erreur à moins que vous entourez le motif avec guillemets: find . -name "*test.c". (Dans le cas où vous choisissez de le préférer à Windows différent find.exeet à utiliser à partir de cmd)
n611x007

Réponses:

393

Essayez de le mettre entre guillemets - vous exécutez l'extension générique du shell, de sorte que ce que vous passez réellement à trouver ressemblera à:

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

... provoquant l'erreur de syntaxe. Essayez donc ceci à la place:

find . -name '*test.c'

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

Chris J
la source
15
À titre d'exemple, vous pouvez voir ce qui se passe si vous le faites echo *test.c... le résultat ne sera pas l'écho qui étend le caractère générique, mais le shell lui-même. La leçon simple est que si vous utilisez des caractères génériques, citez la spécification de fichier :-)
Chris J
Merci de m'avoir aidé avec ce VARIANT. J'ai essayé find . -type f -printf ‘%TY-%Tm-%Td %TT %p\n’comme on le trouve sur le Web et j'ai rencontré "les chemins doivent précéder l'expression". Le problème était que les guillemets étaient trop «intelligents». J'ai retapé la commande, provoquant le remplacement des guillemets, et elle a fonctionné.
Smandoli
2
Pour une raison quelconque, les guillemets simples n'ont pas fonctionné pour moi. J'ai dû utiliser des guillemets doubles. ¯ \ _ (ツ) _ / ¯
Planky
les guillemets simples pour les recherches avec caractères génériques fonctionnaient avec Busybox et GNU find- si vous utilisez un caractère générique, *.$variablevous avez besoin de guillemets doubles.
Stuart Cardall
@Planky: Je mets: find, -name 'write.lock' dans le fichier de script shell mais il a ce message d'erreur. Mais si je tape dans la console, ça marche. Quelqu'un sait pourquoi?
Scott Chu
28

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

find . -name \*test.c
Jim Garrison
la source
#gitbash c'était la solution pour moi avec git bash sur windows, même en citant le MOTIFfind . -name '*txt'
un autre ben
17

Essayez de le mettre entre guillemets:

find . -name '*test.c'
rkulla
la source
13

Depuis le 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
Nick Constantine
la source
0

Je suis tombé sur cette question lorsque j'essayais de trouver plusieurs noms de fichiers que je ne pouvais pas combiner en 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

-oou -orest OU logique. Voir Recherche de fichiers sur Gnu.org pour plus d'informations.

J'exécutais cela sur CygWin.

HappyTown
la source
-1

Dans mon cas, je manquais /de suivre dans le chemin.

find /var/opt/gitlab/backups/ -name *.tar
Vikash Singh
la source
1
Un suivi /n'est pas requis.
melpomene