TOPIC OF ARTICLE BELOW: Find & Delete files young and older then X days (same topic as this article)
Similar articles:
Find & Delete files between 2 dates
Find & Delete files young and older then X days (same topic as this article)
THE ARTICLE:
| 
 SELECT FILE LESS or MORE THEN x DAYS ON LINUX 
############################################## 
NOTE: 
X in this article will be the magical number 5 (5 days). X is in days. The main command we will use is find and its -mtime X argument, where X is in units of days. X will will have a + or – infornt of it or no sign, e.g., it will be -mtime -5 or -mtime +5 or just -mtime 5. -mtime -5 means select all files newer than 5 days, -mtime +5 means select all files older then 5 days, -mtime 5 means select all files 5 days old. 
INTRO: 
Time and time again I let people know that the ‘find’ command in linux, is like a very advantageous file “selection” tool. Here you will see how it works. We get to select all files less then 5 or more then 5 days old (in the current folder, or recuresivly thru every folder) – and if we want we can operate on our selection with -exec, and do a delete with ‘-exec rm’. 
MORE THAN 5 DAYS OLD 
===================== 
RECURSIVELY: 
shopt -s dotglob 
find /path/to/files/* -type f -mtime +5 
—OR— 
find /path/to/files/ -type f -mtime +5 
shopt -u dotglob 
NOT RECURSIVE – ONLY IN MENTIONED FOLDER: 
shopt -s dotglob 
find /path/to/files/* -type f -maxdepth 0 -mtime +5 
—OR— 
find /path/to/files/ -type f -maxdepth 1 -mtime +5 
shopt -u dotglob 
LESS THAN 5 DAYS OLD 
==================== 
RECURSIVELY: 
shopt -s dotglob 
find /path/to/files/* -type f -mtime -5 
—OR— 
find /path/to/files/ -type f -mtime -5 
shopt -u dotglob 
NOT RECURSIVE – ONLY IN MENTIONED FOLDER: 
shopt -s dotglob 
find /path/to/files/* -type f -maxdepth 0 -mtime -5 
—OR— 
find /path/to/files/ -type f -maxdepth 1 -mtime -5 
shopt -u dotglob 
NOTES: 
####### 
WANT FOLDERS AS WELL? 
====================== 
Remove the ‘-type f’ part 
Want folders only change ‘-type f’ to ‘-type d’ 
MTIME 
====== 
Older then 5 days use -mtime +5, for less then 5 days use -mtime -5 
WHATS DOTGLOB FOR 
=================== 
Dont forget to have the * after the path in find. 
But * misses ‘.hidden’ files, so enable dotglob shell option with ‘shopt’ command first, and dont forget to disable it. All of this is below. 
EANBLES * TO FIND HIDDEN FILES: shopt -s dotglob 
DISABLES * FROM FINDING HIDDENS FILES: shopt -u dotglob 
Important knowledge: 
The root of our search path in these examples is /path/to/files. And we tell it to look thru everything that * selects there /path/to/files/* 
find will select all hidden files without “shopt -s dotglob”. 
However this part is hard to explain why it works like this, but here is the effect: 
All of our commands without dotglob enabled, will find hidden files, but not in the root of the directory your searching thru 
/path/to/files/.hiddenfile <– this file will not be seen with find (unless you enable dotglob: shopt -s dotglob) 
/path/to/files/randomfolder/.hiddenfile <– this file will always be found (with or without dotglob enabled: ‘shopt -s dotglob’ OR ‘shopt -u dotglob’) 
This is just the way that find searches thru the defined folder… We tell it to look thru everything in the folder with /path/to/files/* so * doesnt select hiddens by default 
This dotglob doesnt just apply on files, it also applies on folder (yah. yah. I know folders are files in linux). Also if you are searching recursively and you have a hidden folder on the root of the search path, then you will need dotglob on to look thru it or. 
/path/to/files/.hiddenfolder/any-random-file-hidden-or-not <– this file or any other file in there will not be seen with find (unless you enable dotglob: shopt -s dotglob) 
/path/to/files/randomfolder/.hiddenfolder/any-random-file-hidden-or-not <– since the hidden folder is not on the root of the search path, it will get looked thru no matter what (with or without dotglob enabled: ‘shopt -s dotglob’ OR ‘shopt -u dotglob’) 
WITHOUT * MUCH EASIER 
======================== 
All that dotglob business confusing you? Well then just remove the star and change the functions to this format (note we change maxdepth to 1 instead of 0, we need to add 1, if we leave it at 0 it will find nothing.. ever..) 
With maxdepth (increase it by 1) 
find /path/to/files/ -type f -maxdepth 1 -mtime +5 
find /path/to/files/ -type f -maxdepth 1 -mtime -5 
No max-depth? Thats fine! It will still look thru hiddens files/folders: 
find /path/to/files/ -type f -mtime -5 
find /path/to/files/ -type f -mtime -5 
EXEC TO DELETE FILES 
===================== 
To delete append this to the end of the command: 
-exec rm {} \; 
BEFORE DELETING: Run the find command without -exec rm {} \; to simply ensure you selected the correct files 
(STEP 1) Shopt to delete hidden files as well, so that * selects hidden files 
shopt -s dotglob 
(STEP 2) Select which delete command you want 
TO DELETE FILES OLDER THAN 5 DAYS – RECURSIVELY: 
find /path/to/files/* -mtime +5 -exec rm {} \; 
—or— 
find /path/to/files/ -mtime +5 -exec rm {} \; 
OR 
TO DELETE FILES YOUNGER THAN 5 DAYS – RECURSIVELY: 
find /path/to/files/* -mtime -5 -exec rm {} \; 
—or— 
find /path/to/files/ -mtime -5 -exec rm {} \; 
OR 
TO DELETE FILES OLDER THAN 5 DAYS – NONE-RECURSIVELY: 
find /path/to/files/* -maxdepth 0 -mtime +5 -exec rm {} \; 
—or— 
find /path/to/files/ -maxdepth 1 -mtime +5 -exec rm {} \; 
OR 
TO DELETE FILES YOUNGER THAN 5 DAYS – NONE-RECURSIVELY: 
find /path/to/files/* -maxdepth 0 -mtime -5 -exec rm {} \; 
—or— 
find /path/to/files/ -maxdepth 1 -mtime -5 -exec rm {} \; 
(STEP 3) Undo the shopt command, to get back to normal mode where * doesnt select hidden files 
shopt -s dotglob 
MAX DEPTH NOTE 
=============== 
NOTE: to only search the current folder (zero folders depth) use this: 
-maxdepth 0 
If would of used -maxdepth 1, then it would of searched 1 folder deep recursively. 
 |