Por que encontro * main.o, mas não consigo * .o?

19

Este está correto:

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

Então, por que não consigo 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]
Tom Brito
fonte
2
Duplicata de askubuntu.com/questions/112722/… ?
TJ Crowder
O que você chama de correto também está errado. Se houver uma correspondência no diretório atual e outra em um subdiretório, ele não poderá encontrar as duas, a menos que ambas tenham o mesmo nome. Ou seja, no seu primeiro exemplo, poderia haver um arquivo chamado ./sub/domain.o, que não foi encontrado.
kasperd

Respostas:

46

Provavelmente, há mais de um arquivo que corresponde *.o, enquanto apenas um arquivo corresponde *main.o; portanto, no primeiro caso, a expansão do shell é executada:

$ find . -name main.o

e isso funciona. No segundo caso:

$ find . -name file1.o main.o

E é por isso que você obteve erro.

Para evitar isso, você deve citar expressionnos dois comandos:

$ find . -name '*.o'
$ find . -name '*main.o'
Lety
fonte
2
De fato, pode-se facilmente verificar isso com echo *.ovs echo '*.o'.
Ruslan
@Ruslan Depende, se não houver arquivos correspondentes ao glob ( *, ?) bash o tratará como o caractere literal.
@BroSlow, sem dúvida, eu estava falando sobre a situação particular do OP estava.
Ruslan
16

Coloque o padrão do arquivo entre aspas. Caso contrário, * é expandido pelo shell (resolvido para uma lista de arquivos antes que a localização a veja), a localização confusa.

find . -name "*.o"
Stefan Haustein
fonte
13
Como alternativa, escape *com uma barra invertida:find -name \*.o
David Foerster 16/10