• Allgemein
  • Rekursives Auffinden von Dateien nach Name unter Linux

Rekursives Auffinden von Dateien nach Name unter Linux

Syntax des Befehls ‚find‘

Der Befehl find ist ein leistungsstarkes Tool, mit dem du Dateien und Verzeichnisse auf Linux-Systemen basierend auf verschiedenen Kriterien durchsuchen kannst. Die Syntax des Befehls find lautet:

find [Optionen] start_verzeichnis [Ausdrucksliste]

Pflichtargume

  • start_verzeichnis: Das Verzeichnis, in dem die Suche beginnen soll.
  • Ausdrucksliste: Eine Liste von Ausdrücken, die definieren, nach welchen Dateien und Verzeichnissen gesucht werden soll.

Optionale Argumente

find bietet zahlreiche Optionen, die die Suche anpassen und verfeinern können:

Wichtige zu beachtende Punkte

  • Der Befehl find ist rekursiv, d. h. er durchsucht standardmäßig alle Unterverzeichnisse unter dem angegebenen Startverzeichnis.
  • Du kannst Platzhalter wie "*" oder "?" verwenden, um nach Dateien zu suchen, die bestimmten Mustern entsprechen.
  • Du kannst Optionen wie -mtime, -size oder -type verwenden, um Dateien nach Kriterien wie Änderungsdatum, Größe oder Dateityp einzugrenzen.
  • Wenn du versteckte Dateien durchsuchen möchtest, musst du die Option -hidden verwenden.
  • Du kannst die Suchtiefe begrenzen, indem du die Option -maxdepth verwendest.

Verwendung von Platzhaltern

Wenn du nicht den genauen Dateinamen kennst oder nach einer Gruppe von Dateien mit ähnlichen Namen suchst, kannst du Platzhalter verwenden. Dies sind Sonderzeichen, die einen einzelnen Charakter oder eine Zeichenfolge darstellen. Die am häufigsten verwendeten Platzhalter sind:

  • *: Steht für eine beliebige Anzahl von beliebigen Zeichen.
  • ?: Steht für ein einzelnes Zeichen.
  • []: Steht für einen beliebigen Charakter in der Liste innerhalb der eckigen Klammern.
  • {}: Steht für einen beliebigen Charakter oder Ausdruck in der Liste innerhalb der geschweiften Klammern.

Beispiele

  • Um nach allen Dateien zu suchen, die mit "Datei" beginnen, verwende Datei*.
  • Um nach allen Dateien zu suchen, die mit "xyz" enden, verwende *xyz.
  • Um nach allen Dateien zu suchen, die "txt" oder "doc" enthalten, verwende *txt* oder *doc*.
  • Um nach allen Dateien zu suchen, die die Ziffern "1" bis "9" enthalten, verwende *[1-9]*.
  • Um nach allen Dateien zu suchen, die auf Vokale enden, verwende *aeiou$.

Kombinieren von Platzhaltern

Du kannst Platzhalter kombinieren, um komplexere Suchmuster zu erstellen. Beispielsweise:

  • Um nach allen Dateien zu suchen, die "doc" enthalten und mit "Datei" beginnen, verwende Datei*doc*.
  • Um nach allen Dateien zu suchen, die mit "txt" enden und eine beliebige Anzahl von Zeichen in der Mitte enthalten, verwende *txt.

Sonderfälle

Denke daran, dass Platzhalter möglicherweise nicht alle Arten von Sonderzeichen entsprechen. Wenn du nach Dateien suchst, die Sonderzeichen wie Leerzeichen, Punkte oder Schrägstriche enthalten, musst du möglicherweise Escape-Zeichen verwenden. Beispielsweise:

  • Um nach einer Datei namens "Meine Datei.txt" zu suchen, verwende Meine\ Datei\.txt.

Verwende Platzhalter weise, um deine Suche zu optimieren und die gewünschten Dateien schneller zu finden.

Optionen zur Dateieinschränkung (wie Größe, Datum oder Dateityp)

Um die Suche weiter einzugrenzen, bietet der Befehl find zusätzliche Optionen zur Einschränkung der Dateiauswahl. Diese Optionen ermöglichen es dir, Dateien anhand ihrer Größe, ihres Datums oder ihres Typs zu filtern.

Größe

Verwende die Option -size gefolgt von einem Größenoperator und einem Wert, um Dateien basierend auf ihrer Größe einzuschränken. Die gängigen Größenoperatoren sind:

  • -size +<Größe>: Größer als die angegebene Größe
  • -size -<Größe>: Kleiner als die angegebene Größe
  • -size <Größe>: Genaue angegebene Größe

Beispiel: Um alle Dateien zu finden, die größer als 10 MB sind, verwende:

find /home -size +10M

Datum

Beschränke die Suche auf Dateien, die zu einem bestimmten Datum oder innerhalb eines bestimmten Datumsbereichs erstellt, geändert oder aufgerufen wurden. Verwende die folgenden Optionen:

  • -atime: Zeitpunkt des letzten Zugriffs
  • -mtime: Zeitpunkt der letzten Änderung
  • -ctime: Zeitpunkt der letzten Statusänderung

Jede dieser Optionen kann mit einem Operator und einem Datum gefolgt werden. Die gängigen Operatoren sind:

  • -newer <Datei>: Neuer als die angegebene Datei
  • -older <Datei>: Älter als die angegebene Datei
  • -newermt <Datum>: Neuer als das angegebene Datum (Format: JJJJ-MM-TT)
  • -oldermt <Datum>: Älter als das angegebene Datum (Format: JJJJ-MM-TT)

Beispiel: Um alle Dateien zu finden, die in den letzten 7 Tagen geändert wurden, verwende:

find /home -mtime -7

Dateityp

Beschränke die Suche auf Dateien eines bestimmten Typs. Verwende die Option -type gefolgt von einem Dateityp:

  • f: Normale Datei
  • d: Verzeichnis
  • l: Symbolischer Link
  • c: Zeichen-Sonderdatei
  • b: Block-Sonderdatei
  • p: FIFO (Benanntes Pipe)

Beispiel: Um alle Verzeichnisse im aktuellen Verzeichnis zu finden, verwende:

find . -type d

Durch die Kombination dieser Optionen kannst du deine Suche präzise eingrenzen und genau die Dateien finden, die du benötigst.

Berücksichtigung von versteckten Dateien

Versteckte Dateien sind unter Linux Dateien, deren Name mit einem Punkt (.) beginnt. Sie werden standardmäßig von der Ausgabe des Befehls find ausgeschlossen. Um auch versteckte Dateien in deine Suche einzubeziehen, kannst du die Option -a (auch bekannt als -all) verwenden.

Beachte dies:

  • Die Option -a durchsucht auch Verzeichnisse, die mit einem Punkt beginnen, wie .git oder .ssh.
  • Wenn du versteckte Dateien gezielt ausschließen möchtest, verwende die Option -A (auch bekannt als -almost-all).
  • Wenn du nur versteckte Dateien finden möchtest, kombiniere die Option -a mit der Option -name .*\ (beachte den Backslash), um Dateien zu finden, deren Name mit einem Punkt beginnt.

Beispiel:

Um alle Dateien, einschließlich versteckter Dateien, zu finden, die den Namen secret.txt enthalten, führe den folgenden Befehl aus:

find . -a -name secret.txt

Um nur versteckte Dateien zu finden, die den Namen secret.txt enthalten, führe den folgenden Befehl aus:

find . -a -name .*\secret.txt

Rekursive Suche in Unterverzeichnissen

Mithilfe des Find-Befehls kannst du nicht nur in einem einzigen Verzeichnis, sondern auch in allen seinen Unterverzeichnissen rekursiv nach Dateien suchen. Diese Funktion ist besonders nützlich, wenn du eine Datei mit einem bestimmten Namen auf deinem gesamten System finden möchtest.

Um eine rekursive Suche durchzuführen, füge einfach die Option -recurse (oder -r) zu deinem Befehl hinzu. Beispielsweise sucht der folgende Befehl rekursiv nach allen Dateien mit dem Namen "report.txt" im aktuellen Verzeichnis und seinen Unterverzeichnissen:

find . -name "report.txt" -recurse

Rekursive Suche mit Platzhaltern

Du kannst Platzhalter verwenden, um nach Dateien zu suchen, die einem bestimmten Muster entsprechen. Beispielsweise sucht der folgende Befehl rekursiv nach allen Dateien, die mit "report" beginnen:

find . -name "report*" -recurse

Beschränkung der Suchtiefe

Möglicherweise möchtest du die Suchtiefe begrenzen, insbesondere wenn du ein großes Dateisystem durchsuchst. Verwende dazu die Option -maxdepth, gefolgt von der maximalen Anzahl der Verzeichnisebenen, die durchsucht werden sollen. Beispielsweise beschränkt der folgende Befehl die Suche auf die aktuellen Unterverzeichnisse (ohne Unterunterverzeichnisse):

find . -name "report.txt" -recurse -maxdepth 1

Sonderzeichen in Verzeichnisnamen

Wenn du Verzeichnisnamen mit Sonderzeichen hast, musst du diese möglicherweise escapen. Beispielsweise verwendet der folgende Befehl den Escape-Charakter \ vor dem Sternchen, um nach Verzeichnisnamen zu suchen, die ein Sternchen enthalten:

find . -name "dir\*name" -recurse

Begrenzung der Suchtiefe

Um sicherzustellen, dass deine Suche effizient bleibt, kannst du die maximale Tiefe der rekursiven Suche begrenzen. Dies ist hilfreich, wenn du verschachtelte Unterverzeichnisse durchsuchst und verhindern möchtest, dass die Suche zu langsam wird oder zu viele irrelevanten Ergebnisse liefert.

Maximale Suchtiefe festlegen

Verwende die Option -maxdepth, um die maximale Suchtiefe festzulegen. Die Syntax lautet:

find /pfad/zum/verzeichnis -maxdepth <tiefe>

Die tiefe gibt die maximale Anzahl von Ebenen an, in die der Befehl find rekursiv eintauchen soll.

Beispiel:

find /home/benutzername -maxdepth 2

Diese Suche durchsucht nur das Verzeichnis /home/benutzername und die direkt darunter liegenden Unterverzeichnisse (Ebene 1 und 2).

Überlegungen

  • Die Tiefenbeschränkung gilt auch für die Startverzeichnisse, die du in der Befehlszeile angibst.
  • Wenn du -maxdepth 0 verwendest, durchsucht der Befehl find nur das aktuelle Verzeichnis, ohne Unterverzeichnisse zu berücksichtigen.
  • Die Verwendung einer Tiefenbeschränkung kann die Suchzeit erheblich verkürzen, insbesondere bei großen Dateisystemen mit einer komplexen Verzeichnisstruktur.

Suche nach Dateien mit exaktem Namen oder Muster

Um eine Datei zu finden, die exakt einen bestimmten Namen hat, verwende die Option -name. Gib einfach den Dateinamen in Anführungszeichen nach der Option an.

find /pfad/zum/verzeichnis -name "dateiname"

Suche nach Dateien mit Muster

Du kannst auch nach Dateien suchen, die einem bestimmten Muster entsprechen, indem du Platzhalter in der Option -name verwendest. Der Stern (*) steht dabei für eine beliebige Anzahl an Zeichen, das Fragezeichen (?) für ein einzelnes Zeichen.

Beispiele:

  • -name "*.txt": Sucht nach Dateien mit der Endung .txt
  • -name "datei*": Sucht nach Dateien, die mit "datei" beginnen
  • -name "*teil*": Sucht nach Dateien, die das Wort "teil" enthalten

Groß-/Kleinschreibung beachten

Standardmäßig ignoriert der Befehl find die Groß-/Kleinschreibung. Wenn du die Groß-/Kleinschreibung beachten möchtest, verwende die Option -iname.

find /pfad/zum/verzeichnis -iname "DATEINAME"

Besonderheiten bei Sonderzeichen

Wenn du nach Dateien mit Sonderzeichen im Namen suchst, musst du diese mit einem Escape-Zeichen () schützen.

find /pfad/zum/verzeichnis -name "datei\ mit\ sonderzeichen"

Suche nach Dateien, die mit einem bestimmten Muster beginnen oder enden

Dateien finden, die mit einem Muster beginnen

Um Dateien zu finden, die mit einem bestimmten Muster beginnen, kannst du den Platzhalter "*" am Ende des Musters verwenden. Nimm beispielsweise an, du möchtest alle Dateien finden, die mit "Projekt" beginnen:

find / -name "Projekt*"

Dateien finden, die mit einem Muster enden

Um Dateien zu finden, die mit einem bestimmten Muster enden, kannst du den Platzhalter "*" vor dem Muster verwenden. Angenommen, du möchtest alle Dateien finden, die mit ".txt" enden:

find / -name "*txt"

Beachte die Groß- und Kleinschreibung

Standardmäßig ist die Suche nach Dateinamen bei find case-sensitive. Wenn du also nach Dateien mit einem bestimmten Groß-/Kleinschreibungsmuster suchen möchtest, musst du dies explizit angeben. Du kannst die Option -iname verwenden, um eine case-insensitive Suche durchzuführen:

find / -iname "PROJEKT*"

Kombination von Mustern

Du kannst auch mehrere Platzhalter und Muster kombinieren, um komplexere Suchkriterien zu erstellen. Angenommen, du möchtest alle Dateien finden, die mit "Projekt" beginnen und auf ".txt" enden:

find / -name "Projekt*.txt"

Sonderfälle

Es gibt bestimmte Fälle, die beim Auffinden von Dateien nach Muster berücksichtigt werden müssen:

  • Sonderzeichen: Sonderzeichen wie Leerzeichen, Punkte und Schrägstriche müssen maskiert oder mit Escape-Zeichen () verwendet werden.
  • Verborgene Dateien: Standardmäßig werden versteckte Dateien (Dateien, deren Name mit einem Punkt beginnt) nicht in den Suchergebnissen angezeigt. Du kannst die Option -xdev verwenden, um versteckte Dateien in die Suche einzubeziehen.

Ausgabe der Funde im gewünschten Format

Nachdem du die entsprechenden Dateien gefunden hast, kannst du sie in verschiedenen Formaten ausgeben lassen. Hier sind einige Optionen:

Einfache Liste

Die Standardausgabe von find ist eine einfache Liste der Dateipfade:

find /home/benutzer -name "datei.txt"
/home/benutzer/Dokumente/datei.txt
/home/benutzer/Downloads/datei.txt

Lange Liste

Mit der Option -ls erhältst du eine lange Auflistung, die zusätzliche Informationen wie Dateigröße, Datum der letzten Änderung und Dateiberechtigungen enthält:

find /home/benutzer -name "datei.txt" -ls
-rw-r--r-- 1 benutzer benutzer 1024 Jan 1 00:00 /home/benutzer/Dokumente/datei.txt
-rw------- 1 benutzer benutzer 512 März 8 12:00 /home/benutzer/Downloads/datei.txt

Benutzerdefiniertes Format

Du kannst ein benutzerdefiniertes Format für die Ausgabe festlegen, indem du die Option -printf verwendest. Mit ihr kannst du die gewünschten Informationen in einem beliebigen Format zusammenstellen.

find /home/benutzer -name "datei.txt" -printf "%f\n"
datei.txt
datei.txt

Weitere formatierungsbezogene Optionen

  • -count zählt die gefundenen Dateien.
  • -print0 trennt die Dateipfade durch ein Nullzeichen (\0), was für die Weiterverarbeitung in Skripten nützlich ist.
  • -xdev verhindert, dass der Befehl find Dateisysteme überquert, um die Ausgabe auf das aktuelle Dateisystem zu beschränken.

Behandlung von Sonderfällen (wie Verzeichnisse mit Sonderzeichen)

Bei der rekursiven Suche nach Dateien unter Linux kannst du auf Sonderfälle stoßen, wie z. B. Verzeichnisse mit Sonderzeichen in ihren Namen. Diese können zu Problemen bei der Suche führen, wenn du Platzhalter oder Muster verwendest.

Escape-Zeichen verwenden

Um Sonderzeichen in Verzeichnisnamen ordnungsgemäß zu handhaben, musst du Escape-Zeichen verwenden. Escape-Zeichen signalisieren dem Befehl find, dass das folgende Zeichen als Teil des Musters und nicht als Sonderzeichen behandelt werden soll.

Das Escape-Zeichen unter Linux ist der Backslash (\). Du kannst es vor Sonderzeichen wie Leerzeichen, Tabulatoren, Klammern und Sternchen setzen.

Beispiel:

find /home/benutzer -name "Verzeichnis mit Leerzeichen"

Platzhalter und Sonderzeichen

Einige Platzhalter funktionieren möglicherweise nicht wie erwartet, wenn sie in Verzeichnisnamen mit Sonderzeichen verwendet werden. Beispielsweise kann der Platzhalter * alle Dateien in einem Verzeichnis einschließlich versteckter Dateien abgleichen, aber er funktioniert möglicherweise nicht ordnungsgemäß mit Sonderzeichen in den Verzeichnisnamen.

In solchen Fällen kannst du die Option -print0 verwenden, um die Funde mit einem Nullbyte zu trennen. Auf diese Weise kannst du auch Sonderzeichen in den Verzeichnisnamen richtig handhaben.

Beispiel:

find /home/benutzer -print0 -name "Verzeichnis mit Leerzeichen" | xargs -0 printf "%s\n"

Globale Muster

Globale Muster bieten eine flexiblere Möglichkeit, Dateien nach Namen zu suchen, einschließlich derer in Verzeichnissen mit Sonderzeichen. Globale Muster sind der Bash-Syntax sehr ähnlich und verwenden Zeichen wie *, ? und [].

Beispiel:

find /home/benutzer -glob "**/Verzeichnis[ ]mit[ ]Leerzeichen/**"

Weitere Tipps

  • Verwendung von Anführungszeichen: Setze Anführungszeichen um den Suchbegriff, wenn dieser Leerzeichen enthält oder ein Sonderzeichen ist.
  • Konsultieren der find-Manpage: Die find-Manpage enthält ausführliche Informationen zur Verwendung von Escape-Zeichen und Platzhaltern.
  • Verwendung von alternativen Suchwerkzeugen: Es gibt andere Suchwerkzeuge unter Linux, wie z. B. locate und mlocate, die möglicherweise besser mit Verzeichnissen mit Sonderzeichen zurechtkommen.