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 -delete
volta 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/sh
nella riga superiore del file e renderlo eseguibile con chmod a+x
), quindi inserirlo in una cron
directory appropriata come /etc/cron.daily
o /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' -delete
opzione per find
non è 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-execdir
effetto mitigativo nei confronti di tali vulnerabilità.
/a/b/c/[12]
, ma questo è davvero appropriato solo se le sottodirectory hanno nomi a lettera singola. In bash
te puoi fare /a/b/c/{1,2}
. Ovviamente la linea del botto per uno script dovrebbe essere #!/bin/bash
o se stai usando crontab, devi assicurarti che sia configurato per l'uso bash
(non consiglio davvero di cambiarlo se non lo è).
ksh
, bash
E zsh
hanno 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 -execdir
effetto mitigativo nei confronti di tali vulnerabilità.
rm -f
gestisce 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?