为什么 find -mtime +1 只返回 2 天之前的文件?

为什么 find -mtime +1 只返回 2 天之前的文件?

我正在努力理清思绪为什么解释find文件修改时间的方式。具体来说,我不明白为什么-mtime +1不显示 48 小时内的文件。

作为示例测试,我创建了三个具有不同修改日期的测试文件:

[root@foobox findtest]# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 25 08:44 foo1
-rw-r--r-- 1 root root 0 Sep 24 08:14 foo2
-rw-r--r-- 1 root root 0 Sep 23 08:14 foo3

然后我用 switch 运行 find-mtime +1并得到以下输出:

[root@foobox findtest]# find -mtime +1
./foo3

然后我用 find 运行-mmin +1440并得到以下输出:

[root@foobox findtest]# find -mmin +1440
./foo3
./foo2

根据 find 的手册页,我知道这是预期的行为:

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


-atime n
       File  was  last  accessed n*24 hours ago.  When find figures out
       how many 24-hour periods ago the file  was  last  accessed,  any
       fractional part is ignored, so to match -atime +1, a file has to
       have been accessed at least two days ago.

但这对我来说仍然没有意义。那么,如果一个文件已经存在了 1 天、23 小时、59 分钟和 59 秒,那么find -mtime +1忽略所有这些并将其视为已存在 1 天、0 小时、0 分钟和 0 秒?在这种情况下,从技术上讲,它并没有早于 1 天并被忽略?

不...不...计算。

答案1

的参数-mtime被解释为一整天在文件时代。-mtime +n方法严格大于-mtime -n方法严格地少于。

请注意,使用 Bash,您可以执行更直观的操作:

$ find . -mmin +$((60*24))
$ find . -mmin -$((60*24))

分别查找早于 24 小时和新于 24 小时的文件。

-mtime(当您想要以小时或分钟为单位进行解析时,这也比在 for 中输入小数参数更容易。)

答案2

嗯,我想,简单的答案是,您的 find 实现遵循 POSIX/SuS 标准,该标准规定它必须以这种方式运行。引用自SUSv4/IEEE Std 1003.1,2013 年版,“查找”:

-mtime n
     如果从初始化时间中减去文件修改时间
     除以 86400(丢弃任何余数)为 n,则主项应评估为 true。

(在该文件的其他地方,它解释了n实际上可以是+n,以及“大于”的含义)。

至于为什么标准说它应该这样做——好吧,我猜很久以前,程序员很懒或者没有考虑这一点,只是编写了 C 代码(current_time - file_time) / 86400。 C 整数算术丢弃余数。脚本开始依赖于这种行为,因此它被标准化了。

规范的行为也可以移植到仅存储修改日期(而不是时间)的假设系统。不知道有没有这样的系统。

答案3

24 小时小数周期被截断!这意味着“find -mtime +1”表示匹配两天或更长时间前修改的文件。

find . -mtime +0 # find files modified greater than 24 hours ago
find . -mtime 0 # find files modified between now and 1 day ago
# (i.e., in the past 24 hours only)
find . -mtime -1 # find files modified less than 1 day ago (SAME AS -mtime 0)
find . -mtime 1 # find files modified between 24 and 48 hours ago
find . -mtime +1 # find files modified more than 48 hours ago

以下可能只适用于 GNU?

find . -mmin +5 -mmin -10 # find files modified between
# 6 and 9 minutes ago
find / -mmin -10 # modified less than 10 minutes ago

答案4

因此,如果文件已存在 1 天、23 小时、59 分钟和 59 秒,则 find -mtime +1 会忽略所有这些内容,并将其视为已存在 1 天、0 小时、0 分钟和 0 秒?

是的。正如man find所说,“任何小数部分都会被忽略”。如果将“1 天、23 小时、59 分钟和 59 秒”除以“24 小时”,可能会得到 1.9999,但 0.9999 部分随后被删除,文件突然只剩下 1 天了。

相关内容