"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?
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.
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
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