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?
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:
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.
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.
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à.
/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 è).
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à.
rm -fgestisce gli errori in modo silenzioso, gestendo così eventuali condizioni di gara con -exec?
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.
tmpwatchè stato biforcuto tmpreaper, che (almeno su Debian) sembra essere il suo sostituto.
/a/b/c/che non sia necessario specificare per ogni opzione?