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

Mik*_*e B 154 find timestamps

我挣扎来包装我的脑海里围绕为什么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
Run Code Online (Sandbox Code Playgroud)

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

[root@foobox findtest]# find -mtime +1
./foo3
Run Code Online (Sandbox Code Playgroud)

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

[root@foobox findtest]# find -mmin +1440
./foo3
./foo2
Run Code Online (Sandbox Code Playgroud)

根据 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.
Run Code Online (Sandbox Code Playgroud)

尽管如此,这对我来说仍然没有意义。因此,如果一个文件是 1 天 23 小时 59 分钟 59 秒,那么find -mtime +1忽略所有这些并将其视为 1 天 0 小时 0 分 0 秒前?在哪种情况下,从技术上讲,那 1 天并没有被忽略?

不……不……计算。

Evg*_*eev 106

该参数-mtime被解释为数量整天在文件的年龄。-mtime +n表示严格大于-mtime -n表示严格小于。

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

$ find . -mmin +$((60*24))
$ find . -mmin -$((60*24))
Run Code Online (Sandbox Code Playgroud)

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

-mtime当您希望以小时或分钟为单位进行解析时,这也比输入小数参数更容易。)

  • 要以人类可读的大小和按时间顺序列出这些文件(仅限常规),请执行 `$ find 。-type f -mmin -$((60*24)) -exec ls -halt {} +` (2认同)
  • 这也将产生相同的效果,因为这两个命令一起仍然会错过 24 小时前一分钟窗口内的文件。 (2认同)
  • `$(())` 是普通的 shell 算术语法,它不是 Bash 特有的,参见。http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_04 (2认同)

der*_*ert 102

好吧,我想简单的答案是,您的 find 实现遵循 POSIX/SuS 标准,该标准表示它必须以这种方式运行。引用SUSv4/IEEE Std 1003.1, 2013 Edition, "find"

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

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

至于为什么标准说它应该这样做——嗯,我猜在过去很久一个程序员很懒惰或者没有考虑它,只是写了 C 代码(current_time - file_time) / 86400。C 整数算术丢弃余数。脚本根据该行为开始,因此它被标准化。

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

  • find 显然旨在仅执行清理工作。 (3认同)

小智 65

小数 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
Run Code Online (Sandbox Code Playgroud)

以下可能仅适用于 GNU?

find . -mmin +5 -mmin -10 # find files modified between
# 6 and 9 minutes ago
find / -mmin -10 # modified less than 10 minutes ago
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 26

-mtime N表示年龄A(以天为单位)满足N 的文件A < N +1。换句话说,选择NN +1 天前最后修改的文件。-mtime N

-mtime -N表示年龄A满足A < N 的文件,即小于N天前修改的文件。不太直观,意味着年龄A满足N +1 的文件?A,即至少N +1 天前修改过的文件。-mtime +N

例如,-mtime 1选择 1 到 2 天前修改过的文件。-mtime +1选择至少 2 天前修改过的文件。要获取至少 1 天前修改的文件,请使用-mtime +0.

“上次修改时间为 n*24 小时前”的描述只是一个近似值,并不是很清楚。

如果您发现这些规则难以记住,请改用参考文件。

touch -d '1 day ago' cutoff
find . -newer cutoff
Run Code Online (Sandbox Code Playgroud)

(语法“1 day ago”需要 GNU touch。)

  • 很好的解释,前3段应该添加到`find`的文档中! (5认同)

Mar*_*ich 20

因此,如果一个文件是 1 天 23 小时 59 分 59 秒,那么 find -mtime +1 会忽略所有这些并将其视为 1 天 0 小时 0 分 0 秒之前的文件?

是的。就像man find说,“任何小数部分都被忽略”。如果将“1 天 23 小时 59 分 59 秒”除以“24 小时”,您可能会得到 1.9999,但 .9999 部分随后被剥离,突然文件只有 1 天。