开发者

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

开发者 https://www.devze.com 2023-02-14 01:54 出处:网络
I am trying to find a file that are 0 days old. Below are the steps I performed to test this $ ls $ ls -ltr

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开发者_Python百科 -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.


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


   -mtime n
          File's data was last modified n*24 hours ago.  See the  comments
          for -atime to understand how rounding affects the interpretation
          of file modification times.

So, -mtime 0 would be equal to: "File's data was last modified 0 hours ago. While -mtime 1 would be: "File's data was last modified 24 hours ago"

Edit:

   Numeric arguments can be specified as

   +n     for greater than n,

   -n     for less than n,

   n      for exactly n.

So I guess -1 would be modified within the last 24 hours, while 1 would be exactly one day.


The meaning of those three possibilities are as following:
n: exactly n 24-hour periods (days) ago, 0 means today.
+n: "more then n 24-hour periods (days) ago", or older then n,
-n: less than n 24-hour periods (days) ago (-n), or younger then n. It's evident that -1, and 0 are the same and both means "today".

NOTE: If you use parameters with find command in scripts be careful when -mtime parameter is equal zero. Some (earlier) versions of GNU find incorrectly interpret the following expression Sourece: http://www.softpanorama.org/Tools/Find/index.shtml

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号