Aus Linux-Magazin 01/2020

Ein Find-Tutorial

© olegdudko, 123RF

Eine Datei durch Abklappern verschiedener Verzeichnisse zu suchen, ist ineffektiv bis unmöglich. Die gute Nachricht: Linux bringt für diesen Job ein sehr mächtiges Werkzeug mit.

Gemäß dem Unix-Motto ist alles eine Datei – wenn man unter diesem Betriebssystem etwas sucht, muss es sich also auch um eine Datei handeln. Da verwundert es wenig, dass es gerade für die Dateisuche mit »find« ein spezielles Tool gibt.

Find existiert in so ziemlich allen Unix-Derivaten, allerdings mit einem kleinen, aber wichtigen Unterschied: Es gibt eine Version für die BSD-Abkömmlinge, darunter etwa Mac OS, bei der man den Suchpfad zwingend angeben muss, und eine Version für alle System-V-Nachkommen, die stillschweigend im aktuellen Arbeitsverzeichnis sucht, wenn der Anwender keinen Pfad spezifiziert.

Wer sich angewöhnt, jeder Suche einer Pfadangabe mitzugeben, bleibt auf der sicheren Seite. Die Syntax für die einfache Suche lautet dann:

$ find Suchpfad -name Dateiname

Als »Suchpfad« darf man mehrere durch Leerzeichen getrennte Verzeichnisse angeben; der »Dateiname« kann die üblichen Zeichen für das Globbing auf Shell-Ebene enthalten:

$ find / -iname ?dbc.*

Dabei steht »*« für eine beliebige Anzahl beliebiger Zeichen und »?« als Stellvertreter für genau ein Zeichen. Benutzt man »-iname« statt »-name«, ist die Groß- oder Kleinschreibung egal.

Suche nach Zeiten und Größen

Nun kann man aber nicht nur nach (unvollständigen) Dateinamen suchen, sondern beispielsweise auch nach Dateien, die zu einem bestimmten Zeitpunkt geändert wurden. Dafür kennt Find die Optionen »-mtime« und »-mmin«. Ersteres bezieht sich auf ganze Tage und die Zählung beginnt bei null. Entsprechend liefert »-mtime -1« alle in den letzten 48 Stunden geänderten Files. Im zweiten Fall gibt der Anwender die Zeitspanne in Minuten an.

Statt nach dem Zeitpunkt der letzten Änderung lässt sich auch nach dem letzten Zugriff (»-atime«, »-amin«) oder nach der letzten Statusänderung (»-ctime«, »-cmin«) suchen. In allen Fällen muss ein Minuszeichen mit der Bedeutung “in den letzten X Minuten/Tagen” verwendet werden: Ohne Vorzeichen besagt die Zeitangabe “älter als X Minuten/Tage”.

Alle Optionen lassen sich kombinieren. Der folgende Aufruf findet heraus, auf welche Textdateien aus der obersten Ebene des aktuellen Verzeichnisses in der letzten Stunde zugegriffen wurde:

$ find . -maxdepth 1 -name "*.txt" -amin -60

Ganz ählich funktioniert die Suche nach Inodes, nach Eigentümern oder auch nach Dateigrößen:

$ find . -type f -size +50M -user jcb

Diese Suche stöbert im aktuellen Verzeichnis alle Dateien mit einem Umfang von mehr als 50 MByte auf, die dem User jcb gehören.

Suchergebnis weiterverarbeiten

Schließlich kann man das Suchergebnis auch direkt weiterverarbeiten. Dafür bieten sich gleich drei Möglichkeiten an. Erstens: Der Admin verwendet die Option »-exec« und den Ausdruck »{}« für jede Zeile des Suchergebnisses, sowie »\;«, was besagt, dass das Kommando für jede dieser Zeilen einmal aufzurufen ist. Gibt man stattdessen »\+« an, werden alle Ergebniszeilen aneinandergehängt und das Kommando einmal mit allen zusammengeklebten Ergebnissen als Parameter ausgeführt:

$ find . -name "*.txt" -exec ls -al {} \;

Bei der zweiten Variante handelt es sich um eine Pipe zum Kommando »xargs«. Damit sieht dasselbe Beispiel so aus:

$ find . -name "*.txt" | xargs ls -al

Die dritte und letzte Variante schließlich nutzt die Kommandosubstitution der Bash, um zum selben Ergebnis zu kommen:

$ ls -al $(find . -name "*.txt")

Dabei ersetzt die Shell den Ausdruck innerhalb der Klammern durch dessen Rückgabewert beziehungsweise Rückgabewerte.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 1 HeftseitePreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben