Auto delete files older than 7 days
Solution 1
First, this command will find and delete all files older than 7 days in any subdirectory in /home
whose name starts with securityuser
:
find /home/securityuser* -mtime +6 -type f -delete
You need -mtime +6
and not +7
because -mtime
counts 24h periods. As explained in the -atime
section of man find
(-mtime
works in the same way):
-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has to
have been accessed at least two days ago.
So, to find a file that was modified 7 or more days ago, you need to find files that were modified more than 6 days ago, hence -mtime +6
.
The next step is to have this command run once a day. Since each securityuserN
is a different user (you might want to rethink that setup, it makes everything more complicated), this must be run as root. So, edit /etc/crontab
:
sudo nano /etc/crontab
And add this line:
@daily root find /home/securityuser* -mtime +6 -type f -delete
That will run the find
command once a day and delete the files.
Solution 2
as per i my knowledge:
try find
command like this:
find ./dirc/* -mtime +6 -type f -delete
./dirc/* : is your directory (Path)
-mtime +6 : modified more than 6 days ago (therefore, at least 7 days ago)
-type f : only files
-delete : no surprise. Remove it to test before like rm
Related videos on Youtube
Jacco
Updated on September 18, 2022Comments
-
Jacco over 1 year
I am a complete noob at linux but I am starting to get the hang of it. I have an Ubuntu Server 16.04 running an FTP server to backup security video files. The files will be stored in folders like:
/home/securityfolder1
,/home/securityfolder2
,/home/securityfolder3
and so on.Note that each
securityfolderN
is a different user.Because I don't want my hard drives to be full all of the time, I want to delete files older than 7 days in these folders daily.
-
Jacco almost 8 yearsthank you for your answer. Does ./dirc/* means: ./home/securityfolder1/* or is this wrong?
-
Jacco almost 8 yearsI just tried it out in my virtualbox as
find /home/jacco/ -mtime +1 -type f -delete
and it seems to work. How can i automate this? -
Jacco almost 8 yearsi am like the supernoob right here cuz the part of making the script, does this mean a file with
#!/bin/bash
and the code under that? or am i really stupid right here? -
Melebius almost 8 years@JaccovandeWijgaart After the command has been tested, you can just put it into that user’s crontab without making a script. And unlike km8295, I’d prefer absolute paths, especially when deleting.
-
Jacco almost 8 years@Melebius so putting
find /home/securityfolder1/ -mtime +7 -type f -delete
find /home/securityfolder2/ -mtime +7 -type f -delete
find /home/securityfolder3/ -mtime +7 -type f -delete
in the crontab is good? or does it have to be:@daily find /home/securityfolder1/ -mtime +7 -type f -delete
? -
Melebius almost 8 years@JaccovandeWijgaart You’ll definitely need
@daily
or something similar and the*
at end of path. Add each command to the corresponding user’scrontab
, or do it all asroot
(at your own risk). -
Melebius almost 8 years@km8295 The path in
find
command should be closed in quotes (preferably''
), especially when containing glob patterns like*
. -
terdon almost 8 years@Melebius no, tha path should not be quoted, especially when containing glob characters. You want it to be expanded by the shell and the quoting would block that. Try, for example:
find '/u*' -name local
. It's directives like-name "foo*"
that should be quoted when containing glob characters. -
Melebius almost 8 years@terdon You are right, my fault. I use mostly
.
as path forfind
and focus on-name
. -
terdon almost 8 years@km8295 this will find files that are 6 days or older, not 7 days or older.
-
Cbhihe almost 8 years+1 Driving the nail a little deeper and maybe reiterating Melebius' suggestion to OP, that
find '/home/securityuser/*' -mtime +6 -type f -delete
(with all pertinent and appropriate changes in user creation) might generally be a better idea thanfind '/home/securityuser*' -mtime +6 -type f -delete
(no slash in path)... ? -
terdon almost 8 years@Cbhihe no, the target directories are called
/home/securityuserN
, so without the slash, they won't be found. -
terdon almost 8 years@Cbhihe no offense taken! And yes, using separate users for this is not a good idea.
-
Stelios Adamantidis over 5 years+1 From me. Just note one detail as I was running this on RHEL: the wildcard didn't work on the path. I had to put it on the
-name
:find /home/ -name 'securityuser*' -mtime +6 -type f -delete
-
terdon over 5 years@SteliosAdamantidis oh wow, I completely missed that! Yes, the original version wouldn't work since I had quoted
'securityuser*'
. The wildcard should be expanded by the shell, not byfind
, so it should have beensecurityuser*
(no quotes). See updated answer. Thanks for pointing it out, Stelio, I can't believe nobody noticed before! Ti vlakas! -
Stelios Adamantidis over 5 yearsLOL you are anything but that! Keep up the good work.
-
Newbie over 4 yearsCan we add some exceptions to some files that we don't want to delete?
-
terdon over 4 years@Newbie yes, but that's a different question. Look at the
-not
option offind
. For examplefind /home/securityuser* -mtime +6 -type f -not -name wantedFile -delete
.