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?

KingKongFrog
la source

Réponses:

26

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.

Update2

Pour citer le commentaire de Stéphane Chazelas ci-dessous:

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.

Graeme
la source
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?
Acumenus
9

Vous feriez beaucoup mieux d’utiliser 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
la source
2
tmpwatcha été bifurqué tmpreaper, ce qui (au moins sur Debian) semble être son remplacement.
Jaap