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 find
nur im aktuellen Verzeichnis aus. Ich verwende OS X, 10.9.
Antworten:
Das Problem ist, dass Sie Ihren
-name
Parameter nicht angegeben haben. Tun Sie dies stattdessen:Erläuterung
Ohne die Anführungszeichen wird die Shell
*.java
als Glob-Muster interpretiert und auf alle Dateinamen erweitert, die mit dem Glob übereinstimmen, bevor sie an übergeben wirdfind
. Auf diese Weise würde die tatsächliche Befehlszeilefoo.java
im aktuellen Verzeichnis beispielsweise wiefind
folgt lauten: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
*.java
Dateien 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 dienullglob
Option in Bash geregelt) , beispielsweise):find
zeigt sich (aus Versehen) korrektes Verhalten.find
wird beanstandet, dass ein Argument für fehlt-name
.quelle
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:
quelle
-follow
ist ein besser lesbares Synonym für-L
, solange Sie es vor die anderen Parameter setzen.Entfliehen Sie dem
*
quelle