¿Por qué puedo encontrar * main.o pero no puedo * .o?


19

Este es correcto:

$ find . -name *main.o
./main.o

Entonces, ¿por qué no puedo encontrar *.o?

$ find . -name *.o
find: paths must precede expression: main.o
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]


El que llamas correcto también está mal. Si hay una coincidencia en el directorio actual y otra coincidencia en un subdirectorio, no podrá encontrar ambas a menos que ambas tengan el mismo nombre. Es decir, en su primer ejemplo podría haber habido un archivo llamado ./sub/domain.o, que no encontró.
kasperd

Respuestas:


46

Probablemente hay más de un archivo que coincide *.o, mientras que solo un archivo coincide *main.o, por lo que, en el primer caso, se ejecuta la expansión de shell:

$ find . -name main.o

Y esto funciona. En el segundo caso:

$ find . -name file1.o main.o

Y es por eso que tienes un error.

Para evitar esto, debe citar expressionen ambos comandos:

$ find . -name '*.o'
$ find . -name '*main.o'

2
De hecho, uno puede comprobar fácilmente con este echo *.ovs echo '*.o'.
Ruslan

@Ruslan Depende, si no hay archivos que coincidan con el glob ( *, ?) bash lo tratará como el carácter literal.

@BroSlow, sin duda, estaba hablando de la situación particular en que se encontraba el OP.
Ruslan

16

Ponga el patrón del archivo entre comillas. De lo contrario, el shell expande * (se resuelve en una lista de archivos antes de que find lo vea), lo que confunde find.

find . -name "*.o"

13
Alternativamente escapar *con una barra invertida:find -name \*.o
David Foerster
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.