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 楼
好吧,我想,简单的答案是,您的查找实现遵循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
表示年龄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
评论
乍一看,这对我来说也很有趣,但是当您考虑它以整数天为单位衡量文件使用期限时,它确实可以满足您的期望。它不会提供等于1天的文件。具有int(1.99)天的文件不是>1。考虑一下人类如何口语对待年龄。如果某人是79.9岁,则您说他们是79岁。因此,如果您正在寻找79岁以上的人,那么您正在寻找的年龄大于79.99999岁(即> = 80岁)的人。人们将年龄视为整数并将其四舍五入,并将每个年龄视为一个范围。