Finden Dateien und Ordner in Linux

Niraj Menon 22 März 2022
  1. Grundlegende Verwendung des Find-Befehls in Bash
  2. Fortgeschrittene Verwendung des find-Befehls in Bash
Finden Dateien und Ordner in Linux

Was tun Sie, wenn Sie sich in der Bash-Befehlszeile befinden und einen bestimmten Dateityp oder einen Ordner, der mit einem bestimmten Namen beginnt, an einem bestimmten Ort finden müssen? Der Befehl find kann Ihnen helfen, Dateien und Ordner zu finden, die einer Vielzahl von Kriterien entsprechen, und ist daher ein leistungsstarkes Befehlszeilenprogramm in Linux.

Dieses Tutorial erklärt die Verwendung des Befehls find in einem Bash-Shell-Kontext und geht auf die grundlegende Verwendung, fortgeschrittene Anwendungsfälle und die Verwendung in Kombination mit anderen Bash-Shell-Funktionen ein.

Grundlegende Verwendung des Find-Befehls in Bash

Ein find-Befehl ist ein vielseitiges Werkzeug, mit dem alles gefunden werden kann, von einer einfachen Datei bis hin zu mehreren Dateien und Ordnern, die REGular Expressions erfüllen. Der einfachste Anwendungsfall, eine bestimmte Datei oder einen bestimmten Ordner nur im aktuellen Verzeichnis zu finden, kann wie folgt erreicht werden.

find filename.ext
find foldername

Nach Ausführung des entsprechenden Befehls werden ihre Namen ausgedruckt, wenn die Datei oder der Ordner existiert.

Der Befehl find kann auch das Verzeichnis durchsuchen und Unterverzeichnisse eingeben, um die angegebene Datei oder den angegebenen Ordner zu finden. Angenommen, wir haben viele Dateien mit dem Namen test, die in Ordnern in unserem aktuellen Verzeichnis verstreut sind.

Um zu sehen, wo sie sich befinden, können wir Folgendes eingeben.

find . -name test -type f

Der Code sollte die Pfade zu allen Dateien mit dem Namen test im aktuellen Verzeichnis und den Unterverzeichnissen zurückgeben. Die Verwendung des Parameters -type f stellt sicher, dass wir keine Verzeichnisse mit dem Namen test abfangen - wenn Sie ein Programmierer sind, werden Sie bestimmt viele davon haben.

Der Parameter -name ist selbsterklärend, aber wenn Sie möchten, dass bei der Suche nach dem angegebenen Namen Namen wie tEST, Test oder TeST nicht beachtet werden, können wir stattdessen den Parameter -iname verwenden, wo i steht für unsensibel.

Bash-Globs sind nicht unbedingt mit der Verwendung des find-Befehls verbunden. Sie können ein in Ihrem Muster positioniertes Sternchen verwenden, wenn Sie möglicherweise nicht wissen, welche Zeichen oder wie viele davon in Ihrem Muster vorhanden sind.

Wenn Sie zum Beispiel die folgenden Dateien abfangen möchten: test, test2, test_3, testt1, könnten Sie einen Glob verwenden, um diese Sätze zu erfassen, basierend auf der Tatsache, dass sie alle mit dem Wort test beginnen.

Dazu dient der folgende Befehl.

find . -name test*

Der Code sollte alle Dateien oder Verzeichnisse zurückgeben (beachten Sie die Entfernung des Parameters -type f), die mit dem Wort test beginnen.

Fortgeschrittene Verwendung des find-Befehls in Bash

Die find-Befehle können nach verschiedenen Kriterien erweitert werden. Wenn Sie Dateien basierend auf mehreren Globs oder Namen erfassen möchten, sollten Sie die Verwendung der -o- oder OR-Funktion in Betracht ziehen.

Wenn Sie beispielsweise sowohl PDF- als auch Word-DOC/DOCX-Dateien in einem Verzeichnis finden möchten, können Sie dies folgendermaßen tun.

find -iname '*.pdf' -o -iname '*.doc' -o -iname '*.docx'

Unempfindliche Namensparameter zum Abfangen von Dateien, deren Erweiterung auf Großbuchstaben gesetzt wurde, kann bei bestimmten Programmen der Fall sein.

Wenn Sie mit RegEx besser vertraut sind, können Sie auch ein Muster verwenden, um mehrere Kriterien anzugeben, indem Sie die Parameter -regex oder -iregex verwenden.

Um dieselben Erweiterungen wie oben zu erfassen und zusätzlich nach Dateien zu suchen, die mit test beginnen, können wir das folgende Muster verwenden:

find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f

Die Verwendung von Backslashes für spezielle Regex-Zeichen wie Klammern und das Pipe-Symbol verhindert, dass Bash sie verarbeitet, und übergibt den gesamten String direkt an den Befehl find, um zu verhindern, dass unser RegEx fehlschlägt.

Abschließend noch eine Diskussion darüber, wie die Ausgabe des Befehls find verwendet wird – Sie können zählen, wie oft die übereinstimmenden Dateien und Ordner vorkommen, indem Sie in wc leiten, das ein Dienstprogramm zum Zählen von Zeichen/Wörtern/Zeilen ist.

find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f | wc -l

Sie könnten die Daten in einer Variablen speichern, um sie später in Ihrem Skript von einem Befehl zu analysieren.

DOCS=$(find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f)

Denken Sie daran, dass Sonderzeichen, einschließlich Leerzeichen, Zeilenumbrüche und Klammern, in Dateipfaden vorhanden sein können, was zu einem seltsamen Verhalten führt, wenn eine solche Variable an einen Befehl übergeben wird. Achten Sie bei der Verarbeitung solcher Daten darauf, das IFS-Trennzeichen entsprechend zu setzen.

Der find-Befehl bietet auch eine Befehlsausführung pro Element, ähnlich der xargs-Operation. Dies erreichen Sie mit dem Parameter -exec.

Wenn Sie beispielsweise die Berechtigungen für alle übereinstimmenden Dateien und Ordner erhalten möchten, können Sie dies folgendermaßen tun:

find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f -exec ls -l {} \;

Verwandter Artikel - Bash File

Verwandter Artikel - Bash Directory