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]


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'

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"

13
Ewentualnie uciec *z ukośnikiem:find -name \*.o
David Foerster
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.