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]


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'

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"

13
Alternativ können Sie *mit einem Backslash davonkommen:find -name \*.o
David Foerster,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.