
Ich versuche zu verstehen, wie man find -maxdepth 0
die Option verwendet.
Ich habe die folgende Verzeichnisstruktur.
--> file1
--> parent
--> child1
--> file1
--> file2
--> child2
--> file1
--> file2
--> file1
Jetzt führe ich meinen find
Befehl wie unten aus.
find ./parent -maxdepth 0 -name "file1"
find ./ -maxdepth 0 -name "file1"
find . -maxdepth 0 -name "file1"
Mit keinem der oben genannten find
BefehleDatei1wird zurückgegeben.
Auf der Manpage von find
entnehme 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 0
Option gesucht und konnte kein passendes 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 -maxdepth 0
diese 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 file1
im 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 file1
werden 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 find
Befehl 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
find
folgt 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 maxdepth
Wert versucht werden, eine Übereinstimmung mit zu finden , die nicht übereinstimmt.0
file1
.
Jedoch,Die Übergabe *
anstelle von „ .
in Kombination mit“ -maxdepth 0
würde dazu führen, dass Bash durch eine Liste der Dateien im aktuellen Verzeichnis ersetzt *
, was eine Übereinstimmung zurückgeben würde.
Antwort3
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.