查找 - mtime vs mmin - 怪异结果

5

我正在编写一个bash脚本来清理临时文件,但遇到了难以解释的行为。

# Find using mmin flag
find /usr/local/store/file/temp/3_day/ -mmin +$((60*24*3)) -type f > /tmp/old_files_by_mmin.txt

# Find using mtime flag
find /usr/local/store/file/temp/3_day/ -mtime +3 -type f > /tmp/old_files_by_mtime.txt

diff -u /tmp/old_files_by_mmin.txt /tmp/old_files_by_mtime.txt

首先几行:

--- /tmp/old_files_by_mmin.txt  2016-08-03 16:56:42.535458820 +0000
+++ /tmp/old_files_by_mtime.txt 2016-08-03 16:56:58.310681524 +0000
@@ -117,59 +117,6 @@
/usr/local/store/file/temp/3_day/image/resize/2016/07/29/11/15/36/1296924350
/usr/local/store/file/temp/3_day/image/resize/2016/07/29/11/47/52/1950191632
/usr/local/store/file/temp/3_day/image/resize/2016/07/29/11/30/01/711250694
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/10/04/15/44313759
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/10/04/15/1589177813
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/10/04/15/1189074525
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/10/56/44/91382315
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/09/43/45/1622776054
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/01/44/57/1465920226
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/01/23/17/1467026748
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/01/15/58/1990201487
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/01/13/19/1990298215
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/01/35/59/518813467
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/12/10/53/1962045410
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/12/31/27/290517373
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/12/05/08/547481306

为什么 -mmin 标志会找到 mtime 标志找不到的文件?如果两者都应该找到任何比现在 + 3 天旧的文件呢?

1
可能与天数四舍五入有关。顺便问一下,为什么要用bash?据我所知,find不是内置命令。 - mustaccio
@mustaccio:我认为你是正确的。不确定你所说的“find不是内置”的意思是什么。这是一个Linux系统,因此bash/find始终可用。 - Mike Purcell
1
@MikePurcell,“builtin”表示“shell的一部分”,而不是外部工具。如果它不是shell的一部分,那么您需要指定您的确切操作系统以及您的操作系统提供的工具版本。 - Charles Duffy
1
@MikePurcell,BSD的find与GNU的find以及busybox的find非常不同,尽管这三个都可以从bash(或没有 bash,或任何其他shell)中调用。 - Charles Duffy
@CharlesDuffy:有道理。我的系统纯粹是CentOS,因此可移植性不是问题。 - Mike Purcell
1
如果是CentOS,请明确指出是CentOS!否则我们不知道该回答什么。Linux并不是每个人默认都会回答问题的唯一真正操作系统。(可以说,唯一真正的标准是POSIX,因为其他所有东西都试图成为其超集)。 - Charles Duffy
1个回答

1

考虑到实现的差异,值得看一下POSIX标准对于find命令的规定:

-mtime n

如果文件的修改时间减去初始化时间,除以86400 (余数被舍去),等于n,则主要条件为真。


同样地,根据手册(适用于BSD查找):

-mtime n[smhdw]

如果未指定单位,则此主要条件在以下情况下为真:文件最后修改时间与find启动时间之间的差异,向上舍入到下一个完整的24小时周期,为n个24小时周期。

因此,在BSD find中,默认行为是将其舍入到完整的24小时周期。


对于GNU find,有一定的可配置性;请参见-daystart
-daystart
将时间(对于-amin,-atime,-cmin,-ctime,-mmin和-mtime)从今天开始测量,而不是从24小时前开始。此选项仅影响出现在命令行后面的测试。
然而,默认行为如-atime n中所定义:
-atime n
文件最后一次访问是n * 24小时之前。当find计算文件上次访问距离多少个24小时时,任何小数部分都会被忽略,因此要匹配-atime +1,文件必须至少在两天前被访问过。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接