Warum kann ich * main.o finden, * .o aber nicht?

19

Dieser ist richtig:

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

Also, warum kann ich nicht finden *.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
quelle
2
Duplikat von askubuntu.com/questions/112722/… ?
TJ Crowder
Das, was Sie als richtig bezeichnen, ist auch falsch. Wenn es eine Übereinstimmung im aktuellen Verzeichnis und eine andere Übereinstimmung in einem Unterverzeichnis gibt, kann es nicht beide finden, es sei denn, beide haben zufällig denselben Namen. Dh in Ihrem ersten Beispiel hätte es eine Datei geben können ./sub/domain.o, die nicht gefunden wurde.
Kasperd

Antworten:

46

Wahrscheinlich gibt es mehr als eine Datei, die übereinstimmt *.o, während nur eine Datei übereinstimmt *main.o. Daher wird im ersten Fall die Shell-Erweiterung ausgeführt:

$ find . -name main.o

und das funktioniert. Im zweiten Fall:

$ find . -name file1.o main.o

Und deshalb hast du Fehler bekommen.

Um dies zu verhindern, sollten Sie expressionin beiden Befehlen angeben:

$ find . -name '*.o'
$ find . -name '*main.o'
Lety
quelle
2
In der Tat kann man dies leicht mit echo *.ovs überprüfen echo '*.o'.
Ruslan
@Ruslan Hängt davon ab, ob es keine Dateien gibt, die mit der glob ( *, ?) - Bash übereinstimmen. Dies wird als Literalzeichen behandelt.
@BroSlow Zweifellos sprach ich über die besondere Situation, in der sich die OP befand.
Ruslan
16

Setzen Sie das Dateimuster in Anführungszeichen. Andernfalls wird * von der Shell erweitert (in eine Liste von Dateien aufgelöst, bevor find es sieht), was find verwirrt.

find . -name "*.o"
Stefan Haustein
quelle
13
Alternativ können Sie *mit einem Backslash davonkommen:find -name \*.o
David Foerster,