一尘不染

解释'find -mtime'命令

linux

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

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

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

阅读 416

收藏
2020-06-03

共1个答案

一尘不染

find的POSIX规范说:

-mtime n 如果从初始化时间中减去的文件修改时间除以86400(任何剩余部分均被舍弃),则主数据库应评估为true n

有趣的是,对的描述find未进一步指定“初始化时间”。但是,可能find是初始化(运行)的时间。

在描述中,无论在哪里 n 用作主要参数,都应将其解释为十进制整数,可以选择在其前面加上加号(’+’)或减号(’-‘),如下所示:

+n 超过 n
n 没错 n
-n 少于 n

在给定的时间(2014-09-01 00:53:44 -4:00,在这里我推断AST是大西洋标准时间,因此在ISO
8601中与UTC的时区偏移是-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

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

因此 n ,为2014-08-30日志文件计算的值是准确的1(该计算是使用整数算术完成的),而+1拒绝该值是因为它严格来说是一个> 1比较(而不是>= 1)。

2020-06-03