Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"find command -mtime 0" not getting the file i expect

Tags:

unix

I am trying to find a file that are 0 days old. Below are the steps I performed to test this

$ ls
$ ls -ltr
total 0
$ touch tmp.txt
$ ls -ltr
total 0
-rw-r-----   1 tstUser tstUser           0 Feb 28 20:02 tmp.txt
$ find * -mtime 0
$
$ find * -mtime -1
tmp.txt
$

Why is '-mtime 0' not getting me the file?

What is the exact difference between '-mtime 0' and '-mtime -1'?

Im sure there must be other ways to find files that are 0 days old in unix, but im curious in understanding how this '-mtime' actually works.

like image 926
Oscar Gomes Avatar asked Feb 28 '11 12:02

Oscar Gomes


People also ask

How do I find the Mtime of a file in Linux?

Modified timestamp (mtime) indicates the last time the contents of a file were modified. For example, if new contents were added, deleted, or replaced in a file, the modified timestamp is changed. To view the modified timestamp, we can simple use the ls command with -l option.

What is find Mtime?

find command has a great operator for narrowing down the list of results: mtime. as you probably know from the atime, ctime and mtime post, the mtime is a file property confirming the last time the file was modified. find uses mtime option to identify files based on when they were modified.

What is MMIN in find command?

-cmin n. File's status was last changed n minutes ago. -mmin n. File's data was last modified n minutes ago. find.

What is atime in find command?

The -atime option can be used to return files and directories that were accessed x or more days ago. For example, to return files and directories that were accessed 14 or more days ago below the tmp directory.


1 Answers

This is a not user friendly aspect of find - you have to understand how the matching actually works to correctly define your search criteria. The following explanation is based on GNU find (findutils) 4.4.2.

find tests -atime, -ctime, -mtime work on 24 hour periods, therefore let's define "file age" as

floor (current_timestamp - file_modification_timestamp / 86400)

Given three files modified 1 hour ago, 25 hours ago and 49 hours ago

$ touch -t $(date -d "1 hour ago" +"%m%d%H%M") a.txt
$ touch -t $(date -d "25 hours ago" +"%m%d%H%M") b.txt
$ touch -t $(date -d "49 hours ago" +"%m%d%H%M") c.txt

file ages (as defined above) are

$ echo "($(date +"%s") - $(stat -c %Y a.txt)) / 86400" | bc
0
$ echo "($(date +"%s") - $(stat -c %Y b.txt)) / 86400" | bc
1
$ echo "($(date +"%s") - $(stat -c %Y c.txt)) / 86400" | bc
2

Given the above, here's what find does

$ find -type f -mtime 0 # find files with file age == 0, i.e. files modified less than 24 hours ago
./a.txt
$ find -type f -mtime -1 # find files with file age < 1, i.e. files modified less than 24 hours ago
./a.txt
$ find -mtime 1 # find files with file age == 1, i.e. files modified more than (or equal to) 24 hours ago, but less than 48 hours ago
./b.txt
$ find -mtime +1 # find files with file age > 1, i.e. files modified more than 48 hours ago
./c.txt

This shows that -mtime 0 and -mtime -1 give equivalent results.

-mmin gives the same test with finer granularity - argument is minutes instead of 24 hour periods.

I'm unable to reproduce your problem using the aforementioned version of find

$ touch tmp.txt
$ find * -mtime 0
tmp.txt
$ find * -mtime -1
tmp.txt
like image 176
vilpan Avatar answered Sep 19 '22 15:09

vilpan