我正在努力思考为什么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秒。在那种情况下,从技术上讲,那一天还不算老,并且被忽略了?

...不...计算。

评论

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

考虑一下人类如何口语对待年龄。如果某人是79.9岁,则您说他们是79岁。因此,如果您正在寻找79岁以上的人,那么您正在寻找的年龄大于79.99999岁(即> = 80岁)的人。人们将年龄视为整数并将其四舍五入,并将每个年龄视为一个范围。

#1 楼

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


-mtime n
如果减去文件修改时间,则主数据库应评估为true
从初始化时间开始,除以86400(除掉所有余数)的值为n。


(该文档的其他地方解释说n实际上可以是+n,其含义为“大于”。

关于标准为何说它将如此运行的原因-嗯,我猜很久以前,程序员是懒惰的还是没有考虑它,而只是写了C代码(current_time - file_time) / 86400。 C整数算法将舍弃余数。脚本是根据该行为开始的,因此它是标准化的。

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

评论


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

– Kjeld Flarup
17年1月19日在10:47

#2 楼

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

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

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


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

(要在几小时或几分钟内解析,比在-mtime上输入小数参数还容易。)

评论


要按人类可读的大小并按时间顺序列出那些文件(仅常规文件),请执行$ find。 -type f -mmin-$(((60 * 24))-exec ls -halt {} +

– Evgeni Sergeev
2014年2月4日在1:45

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

–章鱼
2014年9月19日20:21在

$(())是普通的shell算术语法,不是特定于Bash,请参见。 pubs.opengroup.org/onlinepubs/009695399/utilities / ...

–乔斯普·罗丹(Josip Rodin)
15年7月22日在20:28

@JosipRodin不,不一定正确!本章描述了sh实用程序和[...]使用的命令语言的语法。由于Bash是“扩展的” SH,因此它支持此语法,但其他一些shell不支持,例如csh / tcsh。

–t0r0X
16年1月29日在17:18



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

–乔斯普·罗丹(Josip Rodin)
16 Jan 29 '21:49



#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


评论


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

–Vnge
16年5月20日在16:06

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

–郑裕ric
16-12-22 6:00



所有源文档的链接都使简单的答案感到困惑。例子很重要。其良好的文档。让我们做更多!我喜欢这个答案

– Peter Moore
19/12/3在4:32



#4 楼

-mtime N表示年龄A(以天为单位)满足N≤A -mtime N会选择在N到N + 1天前最后修改的文件。不那么直观,-mtime -N表示年龄A满足N + 1≤A的文件,即至少N + 1天前修改过的文件。例如,-mtime +N选择1到2天前修改过的文件。 -mtime 1选择至少2天之前修改过的文件。要获取至少在1天前修改过的文件,请使用-mtime +1

描述“在n * 24小时前进行了最后一次修改”只是一个近似值,并不是一个很清晰的描述。

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

touch -d '1 day ago' cutoff
find . -newer cutoff


(“ 1天前”的语法要求GNU -mtime +0。)

评论


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

–梅勒比乌斯
17年9月18日在6:14

#5 楼


因此,如果文件的日期为1天23小时59分59秒,则find -mtime +1将忽略所有内容,并将其视为1天0小时0分0秒。 ?


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

#6 楼

使用-mmin,-amin等获得准确的结果

评论


-?min参数的工作方式与-?time参数完全相同,只是用分钟代替了几天。它们也不是“精确的”。

–吉尔斯'所以-不再是邪恶的'
15年5月2日在20:53

#7 楼

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

find . type -f -daystart -mtime +1


评论


不,首先是-daystart(GNU扩展),而不是--daystart。然后,-daystart只是意味着将时间与今天的开始而不是当前时间进行比较,因此--daystart -mtime +1会报告在今天开始之前48h / 2小时以上被修改的文件,因此通常是文件在前天进行了重大修改。

–StéphaneChazelas
16年1月13日在10:24