"Find: las rutas deben preceder a la expresión:" ¿Cómo especifico una búsqueda recursiva que también encuentra archivos en el directorio actual?

235

Me está costando encontrar la búsqueda de coincidencias en el directorio actual y en sus subdirectorios.

Cuando ejecuto find *test.csolo me da las coincidencias en el directorio actual. (no se ve en subdirectorios)

Si lo intento find . -name *test.c, esperaría los mismos resultados, pero en cambio me da solo coincidencias que están en un subdirectorio. Cuando hay archivos que deben coincidir en el directorio de trabajo, me da:find: paths must precede expression: mytest.c

¿Qué significa este error y cómo puedo obtener las coincidencias tanto del directorio actual como de sus subdirectorios?

Chris Finley
fuente
44
Para el registro, findde msysgit puede arrojar este error a menos que se rodea el patrón con citas: find . -name "*test.c". (En caso de que elija preferirlo sobre Windows 'diferente find.exey usar desde cmd)
n611x007

Respuestas:

393

Intente ponerlo entre comillas: se está encontrando con la expansión comodín del shell, por lo que lo que realmente está pasando para encontrar se verá así:

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

... causando el error de sintaxis. Intenta esto en su lugar:

find . -name '*test.c'

Tenga en cuenta las comillas simples alrededor de la expresión de su archivo: estas detendrán el shell (bash) expandiendo sus comodines.

Chris J
fuente
15
A modo de ejemplo, puede ver lo que sucede si lo hace echo *test.c... el resultado no será eco expandiendo el comodín, sino el propio shell. La lección simple es si estás usando comodines, cita la especificación del archivo :-)
Chris J
Gracias por ayudarme con esta VARIANTE. Intenté find . -type f -printf ‘%TY-%Tm-%Td %TT %p\n’como se encuentra en la web, y me encontré con "las rutas deben preceder a la expresión". El problema era que las comillas eran demasiado "inteligentes". Reescribí el comando, haciendo que se reemplazaran las comillas, y se ejecutó.
Smandoli
2
Por alguna razón, las comillas simples no funcionaron para mí. Tuve que usar comillas dobles. ¯ \ _ (ツ) _ / ¯
Planky
las comillas simples para búsquedas con comodines funcionaron con Busybox y GNU find: si usa un comodín *.$variable, necesita comillas dobles.
Stuart Cardall
@Planky: pongo: find, -name 'write.lock' en el archivo de script de shell pero tiene este mensaje de error. Pero si escribo en la consola, funciona. Alguien sabe por qué?
Scott Chu
28

Lo que sucede es que el shell está expandiendo "* test.c" en una lista de archivos. Intenta escapar del asterisco como:

find . -name \*test.c
Jim Garrison
fuente
#gitbash, esta fue la solución para mí con git bash en Windows, incluso al citar el PATRÓNfind . -name '*txt'
un ben diferente
17

Intenta ponerlo entre comillas:

find . -name '*test.c'
rkulla
fuente
13

Desde el manual de búsqueda:

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
fuente
0

Me encontré con esta pregunta cuando intentaba encontrar varios nombres de archivo que no podía combinar en una expresión regular como se describe en la respuesta de @Chris J, esto es lo que funcionó para mí

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

-oo -ores lógico OR. Consulte Búsqueda de archivos en Gnu.org para obtener más información.

Estaba ejecutando esto en CygWin.

HappyTown
fuente
-1

En mi caso, me faltaba el /rastro en el camino.

find /var/opt/gitlab/backups/ -name *.tar
Vikash Singh
fuente
1
/No se requiere un seguimiento .
melpomene