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


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.


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

#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'

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

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.


-1

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

find /var/opt/gitlab/backups/ -name *.tar

1
/No se requiere un seguimiento .
— melpomene
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.