Cron job pour supprimer des fichiers de plus de 3 jours
21
J'ai besoin de supprimer des fichiers de plus de 3 jours avec un travail cron dans 3 répertoires différents. (ces 3 répertoires sont des enfants d'un répertoire parent /a/b/c/1& /a/b/c/2& /a/b/c/3) Cela peut-il être fait avec une seule ligne dans la crontab?
C'est assez facile (bien que cela passe par un temps de modification il y a plus de 3 jours car un temps de création n'est disponible que sur certains systèmes de fichiers avec des outils spéciaux):
find /a/b/c/1/a/b/c/2-type f -mtime +3#-delete
Supprimez l' #avant avant -deleteune fois que vous êtes sûr qu'il trouve les fichiers que vous souhaitez supprimer.
Pour le faire exécuter par cron, je créerais probablement un script exécutable (ajoutez un shebang - #!bin/shà la première ligne du fichier et le rendre exécutable avec chmod a+x), puis le mettrais dans un cronrépertoire approprié comme /etc/cron.dailyou /etc/cron.weekly. A condition bien sûr que vous n'ayez pas besoin d'un planning plus précis et que ces répertoires existent sur votre distribution.
Mise à jour
Comme indiqué ci-dessous, l' -deleteoption pour findn'est pas très portable. Une approche compatible POSIX serait:
find /a/b/c/1/a/b/c/2-type f -mtime +3#-exec rm {} +
Supprimez à nouveau le #lorsque vous êtes sûr d'avoir les bons fichiers.
Notez qu'il -exec rm {} +a des vulnérabilités de conditions de concurrence qui -delete(lorsqu'elles sont disponibles) n'en ont pas. Ne l'utilisez donc pas sur des répertoires accessibles en écriture par d'autres. Certaines trouvailles ont également un -execdirqui atténue ces vulnérabilités.
Merci! Existe-t-il un moyen de spécifier le répertoire parent, puis les répertoires enfants afin que le /a/b/c/ne doive pas être spécifié pour chaque option?
KingKongFrog
Bien sûr, dans un shell POSIX, vous pouvez le faire /a/b/c/[12], mais cela n'est vraiment approprié que si les sous-répertoires ont des noms à une seule lettre. En bashvous pouvez faire /a/b/c/{1,2}. Bien sûr, alors la ligne bang pour un script devrait être #!/bin/bashou si vous utilisez crontab, vous devez vous assurer qu'il est configuré pour utiliser bash(je ne recommande pas vraiment de le changer s'il ne l'est pas).
Graeme
2
l'expansion des accolades est une fonctionnalité csh et est également prise en charge par ksh, bash, zsh et fish, vous avez donc un large choix de shells. ksh, bashet zshont également des opérateurs d'alternance dans leurs globes. Notez qu'il -exec rm {} +a des vulnérabilités de conditions de concurrence qui -delete(lorsqu'elles sont disponibles) n'en ont pas. Ne l'utilisez donc pas sur des répertoires accessibles en écriture par d'autres. Certaines trouvailles ont également un -execdirqui atténue ces vulnérabilités.
Stéphane Chazelas
Ne rm -fgère pas les erreurs en mode silencieux, gérant ainsi toute condition de concurrence possible avec -exec?
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.
/a/b/c/
ne doive pas être spécifié pour chaque option?/a/b/c/[12]
, mais cela n'est vraiment approprié que si les sous-répertoires ont des noms à une seule lettre. Enbash
vous pouvez faire/a/b/c/{1,2}
. Bien sûr, alors la ligne bang pour un script devrait être#!/bin/bash
ou si vous utilisez crontab, vous devez vous assurer qu'il est configuré pour utiliserbash
(je ne recommande pas vraiment de le changer s'il ne l'est pas).ksh
,bash
etzsh
ont également des opérateurs d'alternance dans leurs globes. Notez qu'il-exec rm {} +
a des vulnérabilités de conditions de concurrence qui-delete
(lorsqu'elles sont disponibles) n'en ont pas. Ne l'utilisez donc pas sur des répertoires accessibles en écriture par d'autres. Certaines trouvailles ont également un-execdir
qui atténue ces vulnérabilités.rm -f
gère pas les erreurs en mode silencieux, gérant ainsi toute condition de concurrence possible avec-exec
?Vous feriez beaucoup mieux d’utiliser
tmpwatch
la source
tmpwatch
a été bifurquétmpreaper
, ce qui (au moins sur Debian) semble être son remplacement.