Dlaczego mogę znaleźć * main.o, ale nie mogę * .o?

19

Ten jest poprawny:

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

Dlaczego więc nie mogę znaleźć *.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
źródło
2
Duplikat askubuntu.com/questions/112722/... ?
TJ Crowder
Ten, który nazywasz poprawnym, jest również zły. Jeśli w bieżącym katalogu jest jedno dopasowanie, a drugie w podkatalogu, nie będzie w stanie znaleźć obu, chyba że oba będą miały tę samą nazwę. Tj. W twoim pierwszym przykładzie mógł istnieć plik o nazwie ./sub/domain.o, którego nie znalazł.
kasperd

Odpowiedzi:

46

Prawdopodobnie istnieje więcej niż jeden pasujący plik *.o, podczas gdy tylko jeden plik pasuje *main.o, więc w pierwszym przypadku uruchamiane jest rozszerzenie powłoki:

$ find . -name main.o

i to działa. W drugim przypadku:

$ find . -name file1.o main.o

I dlatego masz błąd.

Aby temu zapobiec, powinieneś podać expressionoba polecenia:

$ find . -name '*.o'
$ find . -name '*main.o'
Lety
źródło
2
Rzeczywiście, można łatwo sprawdzić z echo *.ovs echo '*.o'.
Ruslan
@ Ruslan Zależy, jeśli nie ma plików pasujących do glob ( *, ?) bash potraktuje to jako dosłowny znak.
@BroSlow niewątpliwie mówiłem o szczególnej sytuacji, w której znajdował się OP.
Ruslan
16

Umieść wzór pliku w cudzysłowie. W przeciwnym razie * jest rozszerzane przez powłokę (przekształcane na listę plików przed znalezieniem go), myląc znajdowanie.

find . -name "*.o"
Stefan Haustein
źródło
13
Ewentualnie uciec *z ukośnikiem:find -name \*.o
David Foerster