Linux find-Befehl: So finden Sie Dateien und Verzeichnisse
Der find-Befehl unter Linux durchsucht das angegebene Verzeichnis und seine Unterelemente, um Dateien oder Verzeichnisse zu finden, die Bedingungen wie Name, Typ oder Größe erfüllen. Geben Sie den Suchort und die Bedingungen zusammen an und setzen Sie Dateinamensmuster in Anführungszeichen, damit die Shell sie nicht vorher erweitert.
Grundformat und Suchbereich
Im folgenden Format ist der Startpfad der Ort, an dem die Suche beginnt, und die Bedingungen begrenzen, was gefunden werden soll. Der Pfad selbst ist ebenfalls im Suchziel enthalten. Die untenstehenden Beispiele basieren auf GNU findutils find und Bash.
find PATH EXPRESSION
find . durchsucht das aktuelle Verzeichnis und Unterverzeichnisse, und find /etc startet von /etc. Wenn keine Bedingungen angegeben sind, werden die Pfade ausgegeben und auch versteckte Dateien und versteckte Verzeichnisse durchsucht. Verzeichnisse ohne Zugriffsrechte können Zugriffsfehler anzeigen, und ihr Inhalt wird nicht durchsucht.
Die nächste Übung erstellt Dateien in einem neuen temporären Verzeichnis. Sie müssen im gleichen Terminal fortfahren, um die workdir-Variable beizubehalten. Nachdem Sie den Pfad ausgegeben haben, um den Ort zu überprüfen, führen Sie das Beispiel aus.
workdir=$(mktemp -d)
mkdir -p "$workdir/docs" "$workdir/empty-dir"
touch "$workdir/docs/app.conf" "$workdir/docs/EXTRA.CONF" "$workdir/docs/notes.txt" "$workdir/.hidden.conf" "$workdir/empty.txt"
printf '%s\n' "$workdir"
Nach Namen und Dateityp suchen
-name stimmt unter Berücksichtigung der Groß- und Kleinschreibung mit der letzten Pfadkomponente überein, nicht mit dem gesamten Pfad. -iname unterscheidet nicht nach Groß- und Kleinschreibung. Einfache Anführungszeichen verhindern, dass die Shell * vor der Übergabe des Musters an find expandiert.
find "$workdir" -name '*.conf'
find "$workdir" -iname '*.conf'
Der erste Befehl sucht nach app.conf und .hidden.conf, und der zweite Befehl findet auch EXTRA.CONF. Die Ausgabereihenfolge kann je nach Umgebung variieren. Das Eintippen von find /etc *.conf hat keine Namensbedingung und kann je nach Shell-Erweiterung unbeabsichtigte Aktionen ausführen, daher sollte man es vermeiden. Stattdessen sollte find /etc -name '*.conf' verwendet werden.
-type f sucht nach regulären Dateien, -type d sucht nach Verzeichnissen. Wenn Bedingungen kombiniert werden, müssen alle erfüllt sein.
find "$workdir" -type f -name '*.conf'
find "$workdir" -type d -name 'docs'
Der erste Befehl gibt nur reguläre Dateien mit passenden Erweiterungen aus, der zweite gibt nur Verzeichnisse mit dem Namen docs aus. Standardmäßig folgt GNU find keinen symbolischen Links in Unterverzeichnisse. Um nach den Links selbst zu suchen, verwenden Sie -type l.
Einschränkung des Bereichs nach Tiefe und leeren Einträgen
-maxdepth 1 durchsucht nur bis zum Startpfad und die direkt darunter liegenden Einträge. Um den Startpfad von den Ergebnissen auszuschließen, geben Sie ebenfalls -mindepth 1 an. Es wird empfohlen, beide Optionen vor Bedingungen in GNU find zu setzen.
find "$workdir" -mindepth 1 -maxdepth 1 -type d
In der Praxis werden docs und empty-dir direkt darunter angezeigt. -empty findet leere reguläre Dateien und leere Verzeichnisse, sodass Sie durch die Angabe des gewünschten Typs unterscheiden können.
find "$workdir" -type f -empty
find "$workdir" -type d -empty
Die mit touch in der Praxis erstellten Dateien sind alle leer. Im zweiten Befehl erscheint empty-dir. Betrachten Sie die Suchergebnisse nicht direkt als Ziele zum Löschen; prüfen Sie zunächst den Pfad und die Bedingungen.
Befehle auf gefundenen Dateien ausführen
-exec führt Befehle für passende Elemente aus. Das folgende Beispiel gibt die Byteanzahl von regulären Dateien aus, ohne sie zu löschen. {} wird durch den gefundenen Pfad ersetzt, und + gruppiert mehrere Pfade so weit wie möglich, um sie an den Befehl zu übergeben.
find "$workdir" -type f -name '*.conf' -exec wc -c -- {} +
Da die Übungsdateien leer sind, wird die Byteanzahl für jede Datei als 0 angezeigt. wc kann auch die Gesamtsumme anzeigen, wenn mehrere Dateien empfangen werden. Selbst wenn es Leerzeichen in den Dateinamen gibt, wird jeder Pfad als separates Argument übergeben. Um den Befehl für jedes Element separat auszuführen, können Sie \; anstelle von + verwenden.
Bevor Befehle zum Löschen oder Ändern kombiniert werden, geben Sie zunächst nur die Pfade unter denselben Bedingungen aus und überprüfen Sie die Ziele und Backups. In Verzeichnissen, in denen andere Benutzer während der Suche Dateien ändern können, können sich die Ziele auch nach der Überprüfung ändern, daher ist besondere Vorsicht geboten. Für weitere Details siehe GNU find Sicherheitsüberlegungen.
Wenn die Ergebnisse von den Erwartungen abweichen
Wenn keine Ergebnisse vorliegen, überprüfen Sie den Startpfad, die Groß- und Kleinschreibung der Buchstaben im Namen, die Erweiterung und den Dateityp in dieser Reihenfolge. Überprüfen Sie auch, ob das Muster in Anführungszeichen gesetzt wurde und ob der vollständige Pfad anstelle von -name benötigt wird. Bei der Suche basierend auf dem vollständigen Pfad können Sie -path verwenden.
Wenn ein Berechtigungsfehler auftritt, bedeutet dies, dass Bereiche nicht durchsucht werden konnten. Überprüfen Sie die erforderlichen Zugriffsrechte, und begrenzen Sie beim Verwenden von Administratorrechten sorgfältig den Suchbereich und die auszuführenden Aktionen. Die detaillierten Bedeutungen von Namensmustern und Optionen finden Sie in Erklärung der Namensmuster von GNU find.




