find: Dateien/Ordner ermitteln, die älter als X Tage sind

Manchmal möchte man Dateien oder Ordner ermitteln, die ein bestimmtes Alter überschritten haben. Ein klassischer Anwendungsfall sind automatisierte Backups: Werden periodisch Sicherungen angelegt, wird das Sicherungslaufwerk früher oder später voll laufen. Um dies zu verhindern, kann man beispielsweise alle ältere Sicherungen nach einer bestimmten Zeitspanne entfernen. Linux besitzt hierfür mit find ein mächtiges Werkzeug, dass im folgenden Vorgestellt werden soll.

Grundsätzlich rufen wir find mit dem Pfad des Ordners auf, in dem gesucht werden soll. Im Beispiel wird im aktuellen Verzeichnis (.) gesucht:


find .

Nach Typen filtern

Mit dem -type Schalter lässt sich dies bereits einschränken: Er Definiert, ob Dateien (f) oder Verzeichnisse (d) gesucht werden. Weitere Optionen sind möglich, etwa l für symbolische Links oder s für Sockets. Existiert pro Backup ein Ordner, könnte der Aufruf wie folgt aussehen:


find . -type d

Allerdings erhalten wir hierbei auch Unterordner höherer Ebenen. Möchten wir nur die Unterordner der ersten Ebene erhalten, sind die Schalter -mindepth und -maxdepth nützlich:


find . -mindepth 1 -maxdepth 1 -type d

Zeitbasierte Einschränkungen

Das vorherige Beispiel listet alle Unterordner auf. Wie im Titel versprochen, möchten wir aber nur entsprechend alte Ordner erhalten. Folgender Befehl findet alle Ordner, die zuletzt vor mehr als 7 Tagen in irgend einer Form geändert wurden:


find . -mindepth 1 -maxdepth 1 -ctime +7 -type d

Zu beachten ist hierbei, dass -ctime jegliche Änderungen der Meta-Daten (Inodes) mit einbezieht. Linux speichert darin Meta-Informationen. Wird eine 10 Tage alte Datei beispielsweise umbenannt oder verschoben, erfasst sie -ctime +7 anschließend nicht mehr. Möchte man nur auf Änderungen des Inhalts reagieren, kann stattdessen -mtime +7 verwendet werden. Es existieren weitere Parameter, die jeweils mit zwei Suffixen vorhanden sind: Das Suffix min akzeptiert einen Wert in Minuten, wogegen time für Tage steht.

Zugriffsmodifier im Überblick

Zugriffsart In Minuten In Tagen
Lesender Zugriff -amin -atime
Schreibender Zugriff (Inhalt) -mmin -mtime
Schreibender Zugriff (Metadaten, Inode) -cmin -ctime

Gefundene Daten/Ordner weiterverarbeiten

Für den häufigen Anwendungsfall des Löschens bietet find einen -delete Parameter. Wichtig: Durch -delete wird automatisch -depth gesetzt. Dies durchläuft zuerst den Inhalt des Ordners. Man sollte daher zunächst den find Aufruf mit -depth testen. So wird sichergestellt, dass keine unerwarteten Löschungen stattfinden. Zu beachten ist auch, dass beim Löschen zunächst alle Ordner unter dem Einstiegspunkt (Standard der aktuelle Ordner) gelöscht werden. Es ist daher Vorsicht geboten. Außerdem kann hier nicht rekursiv gelöscht werden, sodass der Parameter nur für Dateien geeignet ist.

 

Freier ist der -execdir Parameter. Der hier angegebene beliebige Befehl wird für jeden gefundenen Ordner bzw. jede gefundene Datei aufgerufen. Als Platzhalter dient ein Paar geschweifter Klammern {}


find . -mindepth 1 -maxdepth 1 -ctime +7 -type d -execdir echo Ordner: {} \;

Für jedes gefundene Ergebnis erfolgt die Ausgabe „Ordner: <Name>“. Es existiert zwar auch -exec. Dies sollte aus Sicherheitsgründen jedoch nicht genutzt werden: -execdir ruft den Befehl aus dem Zielverzeichnis auf, dass find übergeben wurde. -exec dagegen startet den Befehl aus dem Verzeichnis, woraus find gestartet wurde. Dies kann man auch selbst mit -exec pwd testen.

Um alle Unterordner älter als 7 Tage zu löschen, führen wir folgenden Befehl aus:


find . -mindepth 1 -maxdepth 1 -ctime +7 -type d -execdir rm -r {} \;

Leave a Reply