Ich versuche zu verstehen, wie die Option find -maxdepth 0
verwendet wird.
Ich habe die folgende Verzeichnisstruktur.
--> file1 --> parent --> child1 --> file1 --> file2 --> child2 --> file1 --> file2 --> file1
Jetzt führe ich meinen Befehl find
wie folgt aus.
find ./parent -maxdepth 0 -name "file1" find ./ -maxdepth 0 -name "file1" find . -maxdepth 0 -name "file1"
Mit keinem der oben genannten find
-Befehle Datei1 wird zurückgegeben.
Auf der Manpage von find
sehe ich die folgenden Informationen.
-maxdepth 0 bedeutet, dass die Tests und Aktionen nur auf die Befehlszeilenargumente angewendet werden.
Ich habe mit der Option -maxdepth 0
nach einigen Beispielen gesucht und konnte kein geeignetes Beispiel finden.
Meine find
Version ist,
find --version find (GNU findutils) 4.4.2
Kann mir bitte jemand einige Hinweise geben, in welchen Fällen die Option -maxdepth 0
nützlich wäre ?
BEARBEITEN
Wenn ich den folgenden Befehl ausführe, erhalte ich die file1 wird zweimal aufgelistet. Soll dies so funktionieren?
find . file1 -maxdepth 1 -name "file1" ./file1 file1
Antwort
Nehmen wir an, wir haben file1
im aktuellen Verzeichnis. Dann :
$ find . -maxdepth 0 -name "file1" $ find . file1 -maxdepth 0 -name "file1" file1
Schauen wir uns nun an, was in der Dokumentation angegeben ist:
-maxdepth 0 bedeutet nur y Wenden Sie die Tests und Aktionen auf die Befehlszeilenargumente an.
In meinem ersten Beispiel oben nur das Verzeichnis .
wird in der Befehlszeile aufgelistet. Da .
nicht den Namen file1
hat, wird in der Ausgabe nichts aufgeführt. In meinem zweiten Beispiel oben werden sowohl .
als auch file1
in der Befehlszeile aufgelistet und, weil file1
entspricht -name "file1"
, wurde in der Ausgabe zurückgegeben
Mit anderen Worten bedeutet -maxdepth 0
do nicht Suchverzeichnisse oder Unterverzeichnisse. Suchen Sie stattdessen nur nach einer passenden Datei unter den explizit in der Befehlszeile aufgeführten.
In Ihren Beispielen wurden nur Verzeichnisse in der Befehlszeile aufgelistet, und keines von ihnen wurde mit dem Namen file1
. Daher keine Ausgabe.
Im Allgemeinen können viele Dateien und Verzeichnisse in der Befehlszeile benannt werden. Hier versuchen wir beispielsweise einen find
-Befehl mit 11 Dateien und Verzeichnissen in der Befehlszeile:
$ ls d1 file1 file10 file2 file3 file4 file5 file6 file7 file8 file9 $ find d1 file1 file10 file2 file3 file4 file5 file6 file7 file8 file9 -maxdepth 0 -name "file1" file1
Überlappend Pfade
Betrachten Sie:
$ find . file1 -maxdepth 0 -iname file1 file1 $ find . file1 file1 -maxdepth 0 -iname file1 file1 file1 $ find . file1 file1 -maxdepth 1 -iname file1 ./file1 file1 file1
Wie Ramesh betont, wird find
anscheinend folgen Jeder in der Befehlszeile angegebene Pfad sucht nach Übereinstimmungen, auch wenn die Pfade zu derselben Datei führen, wie in . file
, oder auch wenn die Pfade exakte Duplikate sind, wie in file1 file1
.
Kommentare
- Danke. Aber wie könnte ich einige Dateinamen in der Befehlszeile übergeben?
- Guter Punkt. Siehe meine aktualisierte Antwort. Sie können vor dem ersten Test so viele setzen, wie Sie möchten. Zum Beispiel:
find * -maxdepth 0 -name "file1"
. Die*
listet jede Datei im aktuellen Verzeichnis in der Befehlszeile auf. - @Ramesh Die Antwort wurde erneut aktualisiert, hoffentlich mit besseren Erklärungen und Beispielen. Nochmals vielen Dank. Ich habe meine Frage mit weiteren Details aus Ihrem letzten Update aktualisiert.
- @Ramesh Ich kann sie nicht dokumentiert finden, aber ich sehe dasselbe Verhalten wie Sie:
find
betrachtet jedes Pfad in der Befehlszeile und Berichte stimmen mit jedem überein, auch wenn es sich um Duplikate handelt.
Antwort
Wenn Sie Wenn Sie nicht rekursiv Dateien (keine Verzeichnisse) in einem Verzeichnis suchen möchten, verwenden Sie:
find . -maxdepth 1 -type f -name "file1" # ./file1
-maxdepth 0
sucht nicht nach . Es wird nur versucht, eine Übereinstimmung mit den Datei- / Verzeichnisnamen herzustellen, die Sie als Argumente in find
angegeben haben. Z.B. In der obigen Anweisung würde unter Verwendung eines Werts 0
versucht, file1
mit .
abzugleichen was nicht passt. Wenn Sie *
anstelle von .
übergeben, wird bash *
durch eine Liste von Dateien im aktuellen Verzeichnis ersetzen Dies würde eine Übereinstimmung zurückgeben.