Cron-Auftrag zum Löschen von Dateien, die älter als 3 Tage sind

21

Ich muss Dateien, die älter als 3 Tage sind, mit einem Cron-Job in 3 verschiedenen Verzeichnissen entfernen. (Diese 3 Verzeichnisse sind untergeordnete Verzeichnisse eines übergeordneten Verzeichnisses /a/b/c/1& /a/b/c/2& /a/b/c/3) Kann dies mit einer Zeile in der crontab erfolgen?

KingKongFrog
quelle

Antworten:

26

Dies ist recht einfach (obwohl zu beachten ist, dass dies eine Änderungszeit von mehr als 3 Tagen ist, da eine Erstellungszeit nur auf bestimmten Dateisystemen mit speziellen Tools verfügbar ist):

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-delete

Entfernen Sie das, #bevor -deleteSie sicher sind, dass es die Dateien findet, die Sie entfernen möchten.

Um es von cron ausführen zu lassen, würde ich wahrscheinlich nur ein ausführbares Skript erstellen (einen Shebang #!bin/shin die oberste Zeile der Datei einfügen und mit ausführbar machen chmod a+x) und es dann in ein geeignetes cronVerzeichnis wie /etc/cron.dailyoder stellen /etc/cron.weekly. Vorausgesetzt natürlich, dass Sie keinen genaueren Zeitplan benötigen und diese Verzeichnisse in Ihrer Distribution vorhanden sind.

Aktualisieren

Wie unten erwähnt, ist die -deleteOption für findnicht sehr portabel. Ein POSIX-kompatibler Ansatz wäre:

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-exec rm {} +

Entfernen #Sie erneut die, wenn Sie sicher sind, dass Sie die richtigen Dateien haben.

Update2

Um aus Stéphane Chazelas Kommentar unten zu zitieren :

Beachten Sie, dass -exec rm {} +es Sicherheitslücken in Bezug auf die Racebedingung gibt, die -delete(sofern verfügbar) nicht vorliegen. Verwenden Sie es also nicht für Verzeichnisse, die von anderen beschrieben werden können. Einige Funde haben auch eine -execdir, die diese Sicherheitsanfälligkeiten abschwächt.

Graeme
quelle
Vielen Dank! Gibt es eine Möglichkeit, das übergeordnete Verzeichnis und dann die untergeordneten Verzeichnisse anzugeben /a/b/c/, damit nicht für jede Option das angegeben werden muss?
KingKongFrog
Sicher, in einer POSIX-Shell können Sie dies tun /a/b/c/[12], aber dies ist nur dann wirklich angebracht, wenn die Unterverzeichnisse einzelne Buchstaben haben. In können bashSie tun /a/b/c/{1,2}. Natürlich müsste dann die Bang-Line für ein Skript sein, #!/bin/bashoder wenn Sie Crontab verwenden, müssen Sie sicherstellen, dass es für die Verwendung konfiguriert ist bash(ich empfehle nicht wirklich, es zu ändern, wenn es nicht konfiguriert ist).
Graeme
2
Die Klammererweiterung ist eine csh-Funktion und wird auch von ksh, bash, zsh und fish unterstützt, sodass Sie eine große Auswahl an Shells haben. ksh, bashUnd zshauch Wechsel Betreiber in ihrem Klackse hat. Beachten Sie, dass -exec rm {} +es Sicherheitslücken in Bezug auf die Racebedingung gibt, die -delete(sofern verfügbar) nicht vorliegen. Verwenden Sie es also nicht für Verzeichnisse, die von anderen beschrieben werden können. Einige Funde haben auch eine -execdir, die diese Sicherheitsanfälligkeiten abschwächt.
Stéphane Chazelas
Behandelt rm -fFehler nicht im Stillen, womit etwaige Rennbedingungen behandelt werden -exec?
Acumenus
9

Sie wären viel besser dran mit tmpwatch

tmpwatch recursively removes files which haven't been accessed for a given time. Normally, it's used to clean up directories which are used for temporary holding space such as /tmp.
Barry Chapman
quelle
2
tmpwatchwurde an gegabelt tmpreaper, was (zumindest auf Debian) anscheinend der Ersatz ist.
Jaap