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?
2 Answers
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.
-
Thanks! 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? Jun 12, 2014 at 17:40 -
Sure, 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).– GraemeJun 12, 2014 at 17:52 -
2brace 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. Jun 12, 2014 at 18:59 -
Does
rm -f
not handle errors silently, thereby handling any possible race condition with-exec
? Jul 8, 2015 at 2:49 -
1@Wildcard, see for instance Why did find with -delete erase the files in my /save/ directory when find without delete was not able to locate them? or how to delete (or keep) certain file extensions using busybox find? Jun 7, 2016 at 5:37
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.
-
2
tmpwatch
has been forked totmpreaper
, which (at least on Debian) seems to be it's replacement.– JaapDec 1, 2016 at 16:12