解释“find -mtime”命令

问题描述 投票:0回答:5

我正在尝试删除除最新日志之外的所有带日期的日志。在执行脚本来删除文件之前,我当然想测试我的命令以确保我得到准确的结果。

执行这些命令时,日期为:

Sep  1 00:53:44 AST 2014

目录列表:

Aug 27 23:59 testfile.2014-08-27.log
Aug 28 23:59 testfile.2014-08-28.log
Aug 29 23:59 testfile.2014-08-29.log
Aug 30 23:59 testfile.2014-08-30.log
Aug 31 23:59 testfile.2014-08-31.log
Sep  1 00:29 testfile.log

我认为 -mtime +1 应该列出一天以上的所有文件。为什么 8-30.log 没有列出?

find . -type f -mtime +1 -name "testfile*log"
./testfile.2014-08-27.log
./testfile.2014-08-28.log
./testfile.2014-08-29.log

这就是想要的效果,但这只是尝试和错误。这个0在说什么?

find . -type f -mtime +0 -name "testfile*log"
./testfile.2014-08-30.log
./testfile.2014-08-27.log
./testfile.2014-08-28.log
./testfile.2014-08-29.log
linux bash find
5个回答
176
投票

find 的 POSIX 规范说:

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

的描述并没有进一步指定“初始化时间”。 不过,这可能是
find

初始化(运行)的时间。


在描述中,无论何时使用 

find

作为主要参数,都应将其解释为十进制整数,可选地在前面加一个加号 ( '+' ) 或减号 ( '-' ) 符号,如下所示:

n

超过

+n
  
n

正是
n
n

小于
-n

评论

的内容转移到此答案。 您可以写n

-mtime 6

-mtime -6
:

使用不带符号的 
-mtime +6

表示“等于 6 天 - 因此在 'now - 6 * 86400' 和 'now - 7 * 86400' 之间进行修改”(因为小数天数被丢弃)。
  • 使用
    6
    表示“不到 6 天 - 因此在‘现在 - 6 * 86400’或之后进行了修改”。
  • 使用
    -6
    表示“超过 6 天——因此在‘现在 - 7 * 86400’或之前进行了修改”(其中 7 可能有点出乎意料)。
  • 在给定时间(2014-09-01 00:53:44 -4:00),我推断 AST 是大西洋标准时间,因此在 ISO 8601 中与 UTC 的时区偏移是 -4:00 但+4:00 在 ISO 9945 (POSIX) 中,但这并不重要):
+6

所以:

1409547224 = 2014-09-01 00:53:44 -04:00
1409457540 = 2014-08-30 23:59:00 -04:00

即使“自纪元以来的秒数”值错误,相对值也是正确的(对于世界上某个地方的某些时区,它们是正确的)。

因此,为 2014-08-30 日志文件计算的 

1409547224 - 1409457540 = 89684 89684 / 86400 = 1

值恰好是 n

(计算是通过整数算术完成的),并且 
1 拒绝它,因为它严格来说是
+1 
比较(而不是
> 1
)。
    
+1 表示 2 天前。是圆的。


28
投票

要查找过去 24 小时内修改的所有文件,请使用以下命令。这里的 -1 表示 1 天或更短时间内更改。


13
投票

find . -mtime -1 -ls

1
投票
正如 Jonathan Leffler 在上面的评论中所说,将 + 与 -mtime 一起使用非常有用,因为它适用于一整天。
例如,-mtime +1 查找超过 2 天前更改的文件 => 至少 48 小时。
如果需要更精确,可以使用 -mmin 按分钟搜索。
您还可以组合 -mtime +1 -mtime -3 等选项来查找 2 到 3 天前更改的文件。

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.