Warum ist mein Fund nicht rekursiv?

65

Ich führe den folgenden Befehl aus, der jedoch nicht rekursiv ausgeführt wird:

find . -name *.java

Ich weiß, dass es Java-Dateien weiter unten im aktuellen Verzeichnis gibt, aber es führt das findnur im aktuellen Verzeichnis aus. Ich verwende OS X, 10.9.

user11498
quelle
@Gilles: Diese Frage & Antwort ist viel klarer und weniger lokalisiert als die Betrügerin - sollte eine geschlossen sein, ist es die andere.
Goldlöckchen

Antworten:

88

Das Problem ist, dass Sie Ihren -nameParameter nicht angegeben haben. Tun Sie dies stattdessen:

find . -name '*.java'

Erläuterung

Ohne die Anführungszeichen wird die Shell *.javaals Glob-Muster interpretiert und auf alle Dateinamen erweitert, die mit dem Glob übereinstimmen, bevor sie an übergeben wird find. Auf diese Weise würde die tatsächliche Befehlszeile foo.javaim aktuellen Verzeichnis beispielsweise wie findfolgt lauten:

find . -name foo.java

Dies würde die Datei offensichtlich nur im aktuellen Verzeichnis auflisten (es sei denn, Sie haben einige Dateien mit ähnlichen Namen weiter unten im Baum).

Das Zitieren verhindert die Glob-Erweiterung und übergibt die Befehlszeile unverändert find.

Übrigens, wenn der Glob nicht übereinstimmen würde (keine *.javaDateien im aktuellen Verzeichnis), würden Sie eines von zwei Verhalten erhalten, abhängig davon, wie Ihre Shell eingerichtet ist, um nicht übereinstimmende Globs zu behandeln (dies wird durch die nullglobOption in Bash geregelt) , beispielsweise):

  1. Wenn ein Glob, der nicht passt, nicht durch die Shell erweitert wird, findzeigt sich (aus Versehen) korrektes Verhalten.
  2. Wenn ein Glob, der nicht passt, von der Shell zu einer leeren Zeichenfolge erweitert wird, findwird beanstandet, dass ein Argument für fehlt -name.
Joseph R.
quelle
20

Ich hatte eine ähnliche Situation, in der ich den -name-Wert in Anführungszeichen setzte, aber immer noch nicht alle Suchtreffer erhielt, auf die ich gehofft hatte. Ich vermutete, dass es an Symlinks lag und dass dies der Fall war. Wenn Sie die Suche nach Symlinks erzwingen möchten, können Sie den Befehl folgendermaßen ändern:

find -L . -name '*.java'
Gaoagong
quelle
Symlinks waren auch mein Problem. -followist ein besser lesbares Synonym für -L, solange Sie es vor die anderen Parameter setzen.
Noumenon
0

Entfliehen Sie dem *

find . -name \*.java
Stuart Cardall
quelle