Cron job per eliminare i file più vecchi di 3 giorni


21

Devo rimuovere i file più vecchi di 3 giorni con un lavoro cron in 3 diverse directory. (queste 3 directory sono figli di una directory principale /a/b/c/1& /a/b/c/2& /a/b/c/3) Questo può essere fatto con una riga nel crontab?

Risposte:


26

Questo è abbastanza facile (sebbene si noti che questo passa da un tempo di modifica più di 3 giorni fa poiché un tempo di creazione è disponibile solo su alcuni filesystem con strumenti speciali):

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

Rimuovere la #prima -deletevolta che si è sicuri che sta trovando i file che si desidera rimuovere.

Per farlo funzionare da cron, probabilmente avrei semplicemente creato uno script eseguibile (aggiungere uno shebang - #!bin/shnella riga superiore del file e renderlo eseguibile con chmod a+x), quindi inserirlo in una crondirectory appropriata come /etc/cron.dailyo /etc/cron.weekly. Ovviamente, a condizione che non sia necessario un programma più specifico e che tali directory siano presenti nella distribuzione.

Aggiornare

Come indicato di seguito, l' -deleteopzione per findnon è molto portatile. Un approccio compatibile POSIX sarebbe:

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

Rimuovi di nuovo #quando sei sicuro di avere i file giusti.

Update2

Per citare il commento di Stéphane Chazelas di seguito:

Si noti che -exec rm {} +presenta vulnerabilità legate alle condizioni di gara che -delete(ove disponibili) non presentano. Quindi non usarlo su directory scrivibili da altri. Alcuni risultati hanno anche un -execdireffetto mitigativo nei confronti di tali vulnerabilità.


Grazie! C'è un modo per specificare la directory principale e quindi le directory secondarie in modo /a/b/c/che non sia necessario specificare per ogni opzione?
KingKongFrog,

Certo, in una shell POSIX puoi farlo /a/b/c/[12], ma questo è davvero appropriato solo se le sottodirectory hanno nomi a lettera singola. In bashte puoi fare /a/b/c/{1,2}. Ovviamente la linea del botto per uno script dovrebbe essere #!/bin/basho se stai usando crontab, devi assicurarti che sia configurato per l'uso bash(non consiglio davvero di cambiarlo se non lo è).
Graeme,

2
l'espansione delle parentesi graffe è una funzione csh ed è supportata anche da ksh, bash, zsh e fish in modo da avere una vasta scelta di shell. ksh, bashE zshhanno anche gli operatori di alternanza nei loro grumi. Si noti che -exec rm {} +presenta vulnerabilità legate alle condizioni di gara che -delete(ove disponibili) non presentano. Quindi non usarlo su directory scrivibili da altri. Alcuni risultati hanno anche un -execdireffetto mitigativo nei confronti di tali vulnerabilità.
Stéphane Chazelas,

Non rm -fgestisce gli errori in modo silenzioso, gestendo così eventuali condizioni di gara con -exec?
Acumenus,


9

Sarebbe molto meglio usare 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.

2
tmpwatchè stato biforcuto tmpreaper, che (almeno su Debian) sembra essere il suo sostituto.
Jaap,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.