为什么发现-mtime +1仅返回早于2天的文件?


115

我挣扎来包装我的脑海里围绕为什么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

然后,我使用该-mtime +1开关查找并得到以下输出:

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

然后,我与查找-mmin +1440并获得以下输出:

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

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

 -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秒。在那种情况下,从技术上讲,那一天还不算老,并且被忽略了?

不...不...计算。


7
乍一看,这对我来说也很有趣,但是当您考虑它以整数天为单位衡量文件使用期限时,它便可以完全满足您的期望。它不会提供等于1天的文件。具有int(1.99)天的文件不是>
Octopus

Answers:


86

好吧,我想,简单的答案是,您的查找实现遵循POSIX / SuS标准,该标准表示它必须采用这种方式。引用SUSv4 / IEEE Std 1003.1,2013版,“查找”

-mtime n
     如果
     从初始化时间中减去的文件修改时间除以86400(任何剩余部分均被舍弃),则主数据库应评估为true 。

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

关于该标准为何说它将以这种方式工作的原因–嗯,我想过去很长一段时间,程序员一直懒惰或没有考虑它,只是编写了C代码(current_time - file_time) / 86400。C整数算法将舍弃余数。脚本根据该行为开始,因此已被标准化。

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


2
find被明确设计为仅执行清理工作。
Kjeld Flarup

83

参数to -mtime解释为文件使用期限内的整天数-mtime +n表示严格大于-mtime -n表示严格小于。

请注意,使用Bash,您可以做得更直观:

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

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

(与-mtime要在几小时或几分钟内完成解析的分数参数输入相比,这也容易得多。)


2
要列出这些文件人类可读的大小和时间顺序(仅普通),做$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
叶夫根谢尔盖耶夫

1
这也将具有相同的效果,因为这两个命令一起仍会在24小时前错过该一分钟窗口内的文件。
章鱼

1
$(())是普通的外壳算术语法,不是特定于Bash,请参见。pubs.opengroup.org/onlinepubs/009695399/utilities/…–
Josip Rodin

@JosipRodin不,不一定正确!This chapter describes the syntax of that command language as it is used by the sh utility and [...]。由于Bash是“扩展的” SH,因此它支持此语法,但其他一些Shell不支持,例如csh / tcsh。
t0r0X

@ t0r0X我的观点是,它不是bashism,而是在dash和zsh中工作,并且其他任何功能都可以用作常规/bin/sh
Josip Rodin

43

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

谢谢,我试图找出-mtime X与-mtime + X不同的原因
Vnge

我认为+ X表示(X + 1,X + 2,X + 3,...)的短裤。:)
Eric Zheng

18

因此,如果文件的日期是1天23小时59分59秒,那么find -mtime +1会忽略所有这些,而只是将其视为1天0小时0分0秒。

是。就像man find说“忽略任何小数部分”。如果将“ 1天,23小时,59分钟和59秒”除以“ 24小时”,则可能会得到1.9999,但是随后删除了.9999部分,文件突然才只有1天。


18

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

(语法“ 1天前”需要GNU touch。)


3
很好的解释,前三段应添加到find!的文档中!
Melebius


-2

如果只需要48小时的文件,而不是2天,则应--daystartfind命令中添加。这将为您提供帮助。

find . type -f -daystart -mtime +1

5
不,首先是-daystart(GNU扩展名),不是--daystart。然后,-daystart仅意味着将时间与今天开始而不是当前时间进行比较,因此--daystart -mtime +1报告的文件将在今天开始前48小时/ 2小时之前进行修改,因此通常会在前天之前对文件进行重大修改。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.