Es gibt immer wieder so kleine Problemchen, welche sich leicht mit einem Befehl lösen lassen, aber dann doch etwas tricky sind.
Im folgenden Praxisfall war die Anforderung, dass Dateien und/oder Verzeichnisse auf einer Freigabe zum Austausch von Dateien gelöscht werden sollen, wenn sie älter als 14 Tage sind.
Ein klarer Fall für den find
-Befehl, jedoch gibt es eine kleine Stolperschwelle – nämlich die Verzeichnisse.
Der find
-Befehl zum Löschen von älteren Dateien ist schnell gebaut.
Genutzt mit hier der Parameter -mtime
.
-mtime
ist das Datum der letzten Änderung einer Datei.
Nur zur Anmerkung:
Neben -mtime
gibt es auch noch
-atime
(Datum des letzten Zugriffes )
und
-ctime
(Datum der letzten Datei-Attribut-Änderung )
Während die -(x)time Angabe für „pro 24h“ stehen, kann man bei Zeiten unter 24h die Parameter -amin
, -cmin
und -mmin
verwenden, welche Minutenwerte verarbeiten.
Um Dateien, die älter als 14 Tage alt sind, zu finden benötigt man den Befehl.
1 |
#> find /Pfad/zu/Dateien -mtime +14 |
Um diese auch zu löschen kann man -exec rm -rf {} \;
anhängen.
Das Problem bei dieser Freigabe war allerdings, dass auch Verzeichnisse für Projekte angelegt wurden.
Wenn man obigen Befehl ausführt, dann würden auch Verzeichnisse gefunden und gelöscht.
Es kann aber auch sein, dass in ein Projekt-Verzeichnis ständig neuere Dateien abgelegt werden.
Somit kann es passieren, dass ein Projektverzeichnis älter als 14 Tage ist, aber Dateien enthält die noch jünger als 14 Tage sind.
Der obige Befehl würde aber das Projektverzeichnis als „älter als 14 Tage“ erkennen und mit allen darin enthaltenen, evtl. jüngeren Inhalt, löschen.
Man muss die Suche demnach auf Dateien begrenzen:
1 |
#> find /Pfad/zu/Dateien -mtime +14 -type f -exec rm -rf {} \; |
Leider war auch dieser Befehl nicht ganz zufriedenstellend.
Zwar wurden jetzt nur Dateien gelöscht, welche älter als 14 Tage waren, Verzeichnisse blieben aber immer bestehen – auch wenn sie keine Dateien mehr beinhalteten und somit ebenfalls gelöscht werden sollten.
Nützlich sind hier weitere Funktionen von find
; die Parameter -empty
und -delete
Um leere Verzeichnisse (-type d
)zu löschen kann man folgenden Befehl verwenden:
1 |
#> find /Pfad/zu/Dateien -empty -type d -delete |
(Manchmal ist das Leben wirklich einfach ……..)
Ich habe beide Befehle in ein Bash-File geschrieben und führe dieses nun einmal täglich aus.
Nur der Vollständigkeit halber, hier das Bash-File:
1 2 3 4 5 6 |
#!/bin/bash # find /Pfad/zu/Dateien -mtime +14 -type f -exec rm -rf {} \; find /Pfad/zu/Dateien -empty -type d -delete exit o |