47

find has good support for finding files the more modified less than X days ago, but how can I use find to locate all files modified before a certain date?

I can't find anything in the find man page to do this, only to compare against another files time or to check for differences between created time and now. Is making a file with the desired time and comparing against that the only way to do this?

4
  • 1
    This would be better asked on SuperUser.com – Josh Brower Mar 16 '10 at 11:30
  • 6
    I'm not going to close this: could be interesting for sysadmins as well. – splattne Mar 16 '10 at 13:41
  • The command is for part of a backup script, which grabs everything from /etc that was changed post-installation in our nightly backups. – DrStalker Mar 18 '10 at 1:05
  • 2
    Nine years old and I just noticed when moderating a new answer: the title and the body of this question do not state the same. The title asks for 'files older than <date>' but the body states 'modified after a certain date'. I interpret 'after' as newer than a specific date, not older. – Joffrey Jul 11 '19 at 21:33
27

If you have only '-newer file' then you can use this workaround:

# create 'some_file' having a creation date of 16 Mar 2010:
touch -t 201003160120 some_file

# find all files created after this date
find . -newer some_file

man touch:

  -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

Assuming that your touch has this option (mine is touch 5.97).

1
  • 4
    If you're searching for -older counterpart, which does not exist: Just negate the expression with find . ! -newer some_file ! -name some_file. Second condition is necessary if you really want older files than the specified some_file. – robsch Oct 16 '20 at 9:02
65

No, you can use a date/time string.

From man find:

-newerXY reference
Compares the timestamp of the current file with reference. The reference argument is normally the name of a file (and one of its timestamps is used for the comparison) but it may also be a string describing an absolute time. X and Y are placeholders for other letters, and these letters select which time belonging to how reference is used for the comparison.

          a   The access time of the file reference
          B   The birth time of the file reference
          c   The inode status change time of reference
          m   The modification time of the file reference
          t   reference is interpreted directly as a time

Example:

find -newermt "mar 03, 2010" -ls
find -newermt yesterday -ls
find -newermt "mar 03, 2010 09:00" -not -newermt "mar 11, 2010" -ls
2
  • 5
    I'm using Centos 5.2, which uses GNU find version 4.2.27, and it does not support -newermt or any -newer parameter other than "-newer file" – DrStalker Mar 16 '10 at 7:08
  • 1
    GNU findutils 4.3.3 and newer supports -newerXY according to savannah.gnu.org/bugs/?11668 – Philip Durbin Jun 29 '10 at 13:58
37

Not directly related to question, but might be interesting for some that stumble here.

find command doesn't directly support -older parameter for finding files older than some required date, but you can use negate statement (using accepted answer example):

touch -t 201003160120 some_file
find . ! -newer some_file

will return files older than provided date.

3
  • 3
    editors - maybe it should be merged into accepted answer? – nEJC Sep 6 '12 at 12:18
  • this solution is the most elegant way to solve this kind of issue :) – Labynocle Jan 21 '15 at 15:30
  • Using this idea of negation and avoiding need to touch a file (and specify the no. of days directly instead): $ find . ! -mtime -2 -exec ls -l {} \; – Snidhi Sofpro Feb 10 at 15:29
13
find <dir> -mtime -20

this find command will find files modified within the last 20 days.

  • mtime -> modified (atime=accessed, ctime=created)
  • -20 -> lesst than 20 days old (20 exactly 20 days, +20 more than 20 days)

You acan add additional limitations like:

find <dir> -mtime -20 -name "*.txt"

the same as before, but only finds files ending with '.txt'.

6

Just to add on - you may even use two newermt arguments to search in a time interval:

find ! -newermt "apr 01 2007" -newermt "mar 01 2007" -ls

to find all files from march 2007.

4
find ! -newermt “<DATE>”

like this:

find ! -newermt “jan 01 2015” 

This will give you files older than 01-01-2015 in your current directory.

https://muzaffarmahmoodblog.wordpress.com/2019/07/11/linux-command-to-remove-files-older-than-2015-in-a-directory/

1
  • I was about to write a comment welcoming you on ServerFault and asking you to reconsider posing a duplicate answer until I realized the question title and body say different things: the title asks for 'files older than <date>' and the question states 'modified after a certain date', which in my opinion are two different things. Maybe you could in your post clarify the difference and explain the use of the negate. Thank you for contributing and I will post a comment on the question for clarification. Thank you for contributing! – Joffrey Jul 11 '19 at 21:30
1

You could use a script like this

#!/bin/bash

if [ $# -ne 1 ];then
  when="today"
else
  when=` date -d "$1" +"%s" `
fi
now=`date +"%s"`

seconds=`echo "$when - $now" | bc`
minutes=`echo "$seconds / 60 " | bc `

find . -cmin $minutes -print

Save it in your $PATH as "newerthan" and make it executable.

Then you can find file modified after a certain date like this:

newerthan "2010-03-10"

or

newerthan "last year"

or

newerthan "yesterday"

That should do what you want. I don't think there is a built in way to achieve this otherwise.

2
  • It's not necessary to use bc for integer math, Bash can do it: ((seconds = when - now)), the format argument to date should have a plus date +%s and some systems may not have date -d – Dennis Williamson Mar 16 '10 at 11:02
  • This is for Centos 5.2. Which does have -d. Useful to know about the integer maths though. – Richard Holloway Mar 16 '10 at 11:29
0

if your date is formatted such that its ok for comparison,

mydate=201003160120
find . -type f -printf "%AY%Am%Ad%AH%AM%AS/:%p\n" | awk -vd="$mydate" -F'/:' '$1 > d{ print $2 }'
0
find <dir> -mtime +20

Is the correct answer to this question (find files modified before the last 20 days).

1
  • Actually it's not. The question explicitly asked to find files older than a date, not a number of days. – Andrew Schulman Mar 19 at 15:12

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.