62

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?

Semnodime
  • 105
  • 3
DrStalker
  • 6,676
  • 24
  • 76
  • 106
  • 1
    This would be better asked on SuperUser.com – Josh Brower Mar 16 '10 at 11:30
  • 7
    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 01: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 ' 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

9 Answers9

78

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
Dennis Williamson
  • 60,515
  • 14
  • 113
  • 148
48

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.

nEJC
  • 684
  • 5
  • 4
35

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).

  • 11
    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 09:02
16
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'.

markus_b
  • 351
  • 1
  • 5
7

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.

MortenSickel
  • 203
  • 2
  • 6
5
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/

  • 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 ' 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.

Richard Holloway
  • 7,256
  • 2
  • 24
  • 30
  • 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
find <dir> -mtime +20

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

mt21
  • 1
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 }'
user37841
  • 341
  • 1
  • 2