解释“find -mtime”命令

新手上路,请多包涵

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

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

 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

原文由 user3299633 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

find 的 POSIX 规范说:

-mtime n 如果文件修改时间从初始化时间中减去,除以 86400(丢弃任何余数),则主节点应评估为 n

有趣的是, find 的描述没有进一步指定“初始化时间”。不过,这可能是 find 被初始化(运行)的时间。

在描述中,无论 n 用作主要参数,它都应被解释为可选地前面有加号(’+‘)或减号(’-‘)符号的十进制整数,如下所示:

+n 超过 n

n 正是 n

-n 小于 n

_将 评论 的内容转移到这个答案。_

你可以写 -mtime 6-mtime -6-mtime +6

  • 使用 6 不带符号表示“等于 6 天——因此在 ‘now - 6 * 86400’ 和 ‘now - 7 * 86400’ 之间修改”(因为舍弃了小数天)。
  • 使用 -6 表示“不到 6 天——因此在‘现在 - 6 * 86400’或之后修改”。
  • 使用 +6 表示“超过 6 天 - 在 ‘now - 7 * 86400’ 或之前进行了修改”(其中 7 可能有点出乎意料)。

在给定时间(2014-09-01 00:53:44 -4:00,我推断 AST 是大西洋标准时间,因此与 UTC 的时区偏移量在 ISO 8601 中为 -4:00 但 + ISO 9945(POSIX)中的 4:00,但这并不重要):

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

所以:

 1409547224 - 1409457540 = 89684
89684 / 86400 = 1

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

因此,为 2014 年 8 月 30 日日志文件计算的 n 值恰好是 1 (使用整数运算完成),而 +1 拒绝它,因为它严格来说是 > 1 比较(而不是 >= 1 )。

原文由 Jonathan Leffler 发布,翻译遵循 CC BY-SA 4.0 许可协议

+1 表示 2 天前。它是圆形的。

原文由 txt 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题