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当您希望以小时或分钟为单位进行解析时,这也比输入小数参数更容易。)
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 整数算术丢弃余数。脚本根据该行为开始,因此它被标准化。
规范的行为也可以移植到只存储修改日期(而不是时间)的假设系统。不知道有没有这样的系统。
小智 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。换句话说,选择N到N +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。)
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 天。
| 归档时间: |
|
| 查看次数: |
593719 次 |
| 最近记录: |