GNU find -[cma]时间选项和夏令时

GNU find -[cma]时间选项和夏令时

在 GNU findman 中,您可以阅读有关该选项的内容-atime

-atime n

文件上次访问时间为 n*24 小时前。当 find 计算出上次访问文件是在多少个 24 小时周期之前,任何小数部分都会被忽略,因此为了匹配 -atime +1,文件必须至少在两天前被访问过。

请注意使用“n*24 小时前”而不是“n 天前”。

现在这让我担心在 25 小时长的那一天切换到冬令时会发生什么(偶尔会有 24 小时零 1 秒长的日子,有闰秒)。

如果我每天使用 cron 作业find -daystart -atime +1,是否可能会丢失在该重复小时内访问的文件?

答案1

对于-daystart手册说:

- 选项:-daystart

从今天开始测量时间,而不是从 24 小时前开始。因此,要列出昨天修改的主目录中的常规文件,请执行以下操作

find ~/ -daystart -type f -mtime 1

“-daystart”选项与大多数其他选项不同,因为它会影响其他测试的执行方式。受影响的测试是“-amin”、“-cmin”、“-mmin”、“-atime”、“-ctime”和“-mtime”。 “-daystart”选项仅影响命令行上出现在该选项之后的任何测试的行为。

这意味着如果您运行:

find . -daystart -mtime 1

在冬季更替时间后的第二天(今年欧洲为 2015-10-25),这应该会为您提供在2015-10-25 01:00(该时间第一次出现)和之间最后修改的文件2015-10-25 23:59:59.999...

如果运行为

find . -daystart -mtime 0

在 2015 年 10 月 25 日,您希望它能够为您提供在 00:00 到 22:59:59 之间修改的文件,但是做一个简单的测试(使用 findutils 4.4.2)显示它返回在第一个之间修改的文件01:00 和 23:59:59(除非在时间更改之前运行)。

$ find . -printf '%TFT%TT %p\n'
2015-09-25T14:28:25.4868761490 .
2015-10-25T00:02:00.0000000000 ./a
2015-10-25T23:43:00.0000000000 ./c
2015-10-25T12:42:00.0000000000 ./b
$ NO_FAKE_STAT=1 faketime -m '2015-10-25 12:23' find . -daystart -mtime 0
./c
./b
$ NO_FAKE_STAT=1 faketime -m '2015-10-25 00:32' find . -daystart -mtime 0
./a
./b
$ NO_FAKE_STAT=1 faketime -m '2015-10-25 12:23' find . -daystart -mtime 1
./a

无论如何声明因此,要列出昨天修改的主目录中的常规文件上述并不总是正确的。

如果没有-daystart,则检查以 24 小时为单位修改的文件。因此,如果在 2015 年 10 月 25 日运行12:43find . -mtime 0将为您提供 2015 年 10 月 24 日 13:43 至今修改的文件。

为您提供昨天最后修改的文件的更可靠方法是:

 find . -newermt 'yesterday 0' ! -newermt 'today 0'

请注意,它包括今天在 00:00:00.0000000000 最后修改的文件,而不是昨天那个时间的文件。不幸的是没有-oldermt谓词。

请注意,在 glob 中使用zshage函数如下:

$ autoload age # in ~/.zshrc
$ ls -ld -- *(age,yesterday,)

有类似的问题。

相关内容