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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.