17

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.

  • /home usually contains a subfolder for each user. If you don’t want to store your backups as different users (not really good idea), you should consider another location, e.g. /home/security/backup1 and so on. – Melebius Jun 21 '16 at 6:26
  • @Melebius thank you for your comment, every /securityfolder is a different user, i forgot to mention that. – Jacco van de Wijgaart Jun 21 '16 at 6:35
25

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.

  • +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 than find '/home/securityuser*' -mtime +6 -type f -delete (no slash in path)... ? – Cbhihe Jun 22 '16 at 6:46
  • @Cbhihe no, the target directories are called /home/securityuserN, so without the slash, they won't be found. – terdon Jun 22 '16 at 7:13
  • yup, saw that; just didn't think it good practice on OP's part (creating a separate user for each security video, etc...) along the line of Melebius' first comment, even though OP may have his reasons for doing so. If anything my comment was lame, not a criticism of yr good and complete answer. – Cbhihe Jun 22 '16 at 7:20
  • 1
    +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 – Stelios Adamantidis Jan 3 at 10:04
  • 1
    @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 by find, so it should have been securityuser* (no quotes). See updated answer. Thanks for pointing it out, Stelio, I can't believe nobody noticed before! Ti vlakas! – terdon Jan 3 at 10:13
4

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
  • thank you for your answer. Does ./dirc/* means: ./home/securityfolder1/* or is this wrong? – Jacco van de Wijgaart Jun 21 '16 at 6:38
  • I 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 van de Wijgaart Jun 21 '16 at 6:42
  • make one script file and fire this command using script if it work than run your script file on startup process. – Maulik Patel Jun 21 '16 at 6:49
  • i 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? – Jacco van de Wijgaart Jun 21 '16 at 6:51
  • 2
    @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. – terdon Jun 21 '16 at 8:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.