find -maxdepth 0 gibt mir keine Ausgabe zurück

find -maxdepth 0 gibt mir keine Ausgabe zurück

Ich versuche zu verstehen, wie man find -maxdepth 0die Option verwendet.

Ich habe die folgende Verzeichnisstruktur.

--> file1
--> parent
          --> child1
                   --> file1
                   --> file2
          --> child2
                   --> file1
                   --> file2
          --> file1

Jetzt führe ich meinen findBefehl wie unten aus.

find ./parent -maxdepth 0 -name "file1"
find ./ -maxdepth 0 -name "file1"
find . -maxdepth 0 -name "file1"

Mit keinem der oben genannten findBefehleDatei1wird zurückgegeben.

Auf der Manpage von findentnehme ich die folgenden Informationen.

-maxdepth 0 bedeutet, dass die Tests und Aktionen nur auf die Befehlszeilenargumente angewendet werden.

Ich habe nach einigen Beispielen mit -maxdepth 0Option gesucht und konnte kein passendes Beispiel finden.

Meine findVersion ist,

find --version
find (GNU findutils) 4.4.2

Kann mir bitte jemand einige Hinweise geben, in welchen Fällen -maxdepth 0diese Option nützlich sein könnte?

BEARBEITEN

Wenn ich den folgenden Befehl ausführe, erhalte ich dieDatei1doppelt gelistet werden. Ist das so gewollt?

find . file1 -maxdepth 1 -name "file1"
./file1
file1

Antwort1

Nehmen wir an, wir befinden uns file1im aktuellen Verzeichnis. Dann:

$ find . -maxdepth 0 -name "file1"
$ find . file1 -maxdepth 0 -name "file1"
file1

Schauen wir uns nun an, wasdie DokumentationZustände:

-maxdepth 0 bedeutet, dass die Tests und Aktionen nur auf die Befehlszeilenargumente angewendet werden.

In meinem ersten Beispiel oben wurde nur das Verzeichnis.wird in der Befehlszeile aufgeführt. Da.nicht den Namen hat file1, wird in der Ausgabe nichts aufgeführt. In meinem zweiten Beispiel oben haben beide.und  file1werden in der Befehlszeile aufgelistet und, da file1übereinstimmt -name "file1", wurde es in der Ausgabe zurückgegeben.

Mit anderen Worten -maxdepth 0:nichtDurchsuchen Sie Verzeichnisse oder Unterverzeichnisse. Suchen Sie stattdessen nur nach einer passenden Datei unter den Dateien, die in der Befehlszeile explizit aufgeführt sind.

In Ihren Beispielen wurden in der Befehlszeile nur Verzeichnisse aufgelistet und keines davon hatte den Namen file1. Daher keine Ausgabe.

Im Allgemeinen können viele Dateien und Verzeichnisse auf der Kommandozeile benannt werden. Hier versuchen wir beispielsweise einen findBefehl mit neun Dateien und Verzeichnissen auf der Kommandozeile:

$ ls
d1  file1  file10  file2  file3  file4  file5  file6  file7
$ find d1 file1 file10 file2 file3 file4 file5 file6 file7 -maxdepth 0 -name "file1"
file1

Überlappende Pfade

Halten:

$ 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

findfolgt jedem in der Befehlszeile angegebenen Pfad und sucht nach Übereinstimmungen, auch wenn die Pfade zur selben Datei führen, wie in . file, oder auch wenn die Pfade exakte Duplikate sind, wie in file1 file1.

Antwort2

Wenn Sie nicht rekursiv Dateien (keine Verzeichnisse) in einem Verzeichnis finden möchten, verwenden Sie:

find . -maxdepth 1 -type f -name "file1"
# ./file1

-maxdepth 0 werde nicht suchen. Es wird nur versucht, eine Übereinstimmung zwischen den Datei-/Verzeichnisnamen zu finden, die Sie als Argumente in angegeben haben find.

Beispielsweise würde in der obigen Anweisung mit dem maxdepthWert versucht werden, eine Übereinstimmung mit zu finden , die nicht übereinstimmt.0file1.

Jedoch,Die Übergabe *anstelle von „ .in Kombination mit“ -maxdepth 0würde dazu führen, dass Bash durch eine Liste der Dateien im aktuellen Verzeichnis ersetzt *, was eine Übereinstimmung zurückgeben würde.

Antwort3

Verwendung:

John1024 gab gute Beispiele,Wiezu verwenden -maxdepth 0, also füge ich nur Informationen hinzu vonWannum es zu benutzen:

Was ist der Grund dafür -maxdepth 0? Wenn Sie den Namen kennen, können Sie einfach den Befehl eingeben

ls file-* 

Nun, es ist möglicherweise nicht der Name, nach dem Sie suchen.

Beispiel:

touch file-{1..3}
echo "1" > file-1
touch -d @0 file-2

find * -maxdepth 0 -name "file-*" \( -size 1k -o -mtime +10000 \) -ls 
   669266     12 -rw-rw-r--   1 stefan   stefan          2 Mai  4 20:57 file-1
   669270      8 -rw-rw-r--   1 stefan   stefan          0 Jan  1  1970 file-2

Ich erstelle 3 Dateien mit dem Namensmuster file-*. Dann füge ich Nr. 1 etwas Inhalt hinzu, setze bei Nr. 2 das Datum zurück und lasse Nr. 3 wie sie ist.

Jetzt suche ich in vielleicht 1000 Dateien nach Dateien mit 1k (Nr. 1) oder einem Alter > ca. 30 Jahre. Im Beispiel nur unter 3 Dateien.

Aber find * durchsucht jede Datei im aktuellen Verzeichnis, daher der etwas fremdartige Manpage-Jargon des „Ausgangspunkts“, anstatt nur von Verzeichnissen zu sprechen. Ich schätze, die leistungsstarken Filterfunktionen von find haben zu der Entscheidung geführt, nach Dateien zu suchen, von denen man weiß, wo sie sich befinden (das $PWD), aber man kann mit Standard-Shell-Tools nicht einfach nach anderen Attributen filtern.

verwandte Informationen