How to find and delete files older than specific days in unix?

  • I have got one folder for log with 7 folders in it. Those seven folders too have subfolders in them and those subfolders have subfolders too. I want to delete all the files older than 15 days in all folders including subfolders without touching folder structrure, that means only files.

    [email protected]:/var/dtpdev/tmp/ > ls
    A1  A2  A3  A4  A5  A6  A7
    
    [email protected]:/var/dtpdev/tmp/A1/ > ls
    B1 B2 B3 B4 file1.txt file2.csv
    
  • Jan

    Jan Correct answer

    6 years ago

    You could start by saying find /var/dtpdev/tmp/ -type f -mtime +15. This will find all files older than 15 days and print their names. Optionally, you can specify -print at the end of the command, but that is the default action. It is advisable to run the above command first, to see what files are selected.

    After you verify that the find command is listing the files that you want to delete (and no others), you can add an "action" to delete the files. The typical actions to do this are:

    1. -exec rm -f {} \; (or, equivalently, -exec rm -f {} ';')
      This will run rm -f on each file; e.g.,

      rm -f /var/dtpdev/tmp/A1/B1; rm -f /var/dtpdev/tmp/A1/B2; rm -f /var/dtpdev/tmp/A1/B3; …
      
    2. -exec rm -f {} +
      This will run rm -f on many files at once; e.g.,

      rm -f /var/dtpdev/tmp/A1/B1 /var/dtpdev/tmp/A1/B2 /var/dtpdev/tmp/A1/B3 …
      

      so it may be slightly faster than option 1.  (It may need to run rm -f a few times if you have thousands of files.)

    3. -delete
      This tells find itself to delete the files, without running rm. This may be infinitesimally faster than the -exec variants, but it will not work on all systems.

    So, if you use option 2, the whole command would be:

    find /var/dtpdev/tmp/ -type f -mtime +15 -exec rm -f {} +
    

    Using -delete is simpler (syntax and no child processes spawned to do delete) but may not work on all systems. rm -f {} + is best, it will delete files in batches if there are enough files to be too much for one command-line. rm -f {} ';' will give command too long error if there are enough files to be too much for one command-line.

License under CC-BY-SA with attribution


Content dated before 6/26/2020 9:53 AM