Cron job to delete files older than 3 days
Solution 1
This is easy enough (although note that this goes by a modification time more than 3 days ago since a creation time is only available on certain filesystems with special tools):
find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-delete
Remove the #
before the -delete
once you are sure that it is finding the files you want to remove.
To have it run by cron, I would probably just create an executable script (add a shebang - #!bin/sh
to the top line of the file and make executable with chmod a+x
), then put it in an appropriate cron
directory like /etc/cron.daily
or /etc/cron.weekly
. Provided of course that you do not need a more specific schedule and that these directories exist on your distro.
Update
As noted below, the -delete
option for find
isn't very portable. A POSIX compatible approach would be:
find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-exec rm {} +
Again remove the #
when you are sure you have the right files.
Update2
To quote from Stéphane Chazelas comment below:
Note that
-exec rm {} +
has race condition vulnerabilities which-delete
(where available) doesn't have. So don't use it on directories that are writeable by others. Some finds also have a-execdir
that mitigates against those vulnerabilities.
Solution 2
You would be much better off using 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.
Related videos on Youtube
KingKongFrog
Updated on September 18, 2022Comments
-
KingKongFrog over 1 year
I need to remove files older than 3 days with a cron job in 3 different directories. (these 3 directories are children of a parent directory
/a/b/c/1
&/a/b/c/2
&/a/b/c/3
) Can this be done with one line in the crontab? -
KingKongFrog almost 10 yearsThanks! Is there a way to specify the parent directory and then the child directories so the
/a/b/c/
doesn't have to be specified for every option? -
Graeme almost 10 yearsSure, in a POSIX shell you can do
/a/b/c/[12]
, but this is only really appropriate if the subdirectories have single letter names. Inbash
you can do/a/b/c/{1,2}
. Of course then the bang line for a script would have to be#!/bin/bash
or if you are using crontab, you need to make sure it is configured to usebash
(I don't really recommend changing it if it isn't). -
Stéphane Chazelas almost 10 yearsbrace expansion is a csh feature and is also supported by ksh, bash, zsh and fish so you have a wide choice of shells.
ksh
,bash
andzsh
also have alternation operators in their globs. Note that-exec rm {} +
has race condition vulnerabilities which-delete
(where available) doesn't have. So don't use it on directories that are writeable by others. Some finds also have a-execdir
that mitigates against those vulnerabilities. -
cjaphe almost 9 yearsDoes
rm -f
not handle errors silently, thereby handling any possible race condition with-exec
? -
Wildcard almost 8 years@StéphaneChazelas, could you please link to a more full explanation of the race condition you mentioned? I'm interested.
-
Stéphane Chazelas almost 8 years
-
Jaap over 7 years
tmpwatch
has been forked totmpreaper
, which (at least on Debian) seems to be it's replacement.