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

1lu*_*ppa 6 find time

在 GNU findman 中,您可以阅读有关该-atime选项的信息:

-atime n

文件最后一次访问是在 n*24 小时前。当 find 计算出该文件在多少 24 小时前被上次访问时,任何小数部分都将被忽略,因此要匹配 -atime +1,文件必须至少在两天前被访问过。

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

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

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

Sté*_*las 5

对于-daystart手册说:

- 选项: -daystart

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

find ~/ -daystart -type f -mtime 1
Run Code Online (Sandbox Code Playgroud)

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

这意味着如果你运行:

find . -daystart -mtime 1
Run Code Online (Sandbox Code Playgroud)

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

如果运行为

find . -daystart -mtime 0
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)

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

如果没有-daystart,则检查以 24 小时为单位修改的文件。所以如果在12:432015-10-25运行,find . -mtime 0会给你在 2015-10-24 13:43 和现在之间修改的文件。

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

 find . -newermt 'yesterday 0' ! -newermt 'today 0'
Run Code Online (Sandbox Code Playgroud)

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

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

$ autoload age # in ~/.zshrc
$ ls -ld -- *(age,yesterday,)
Run Code Online (Sandbox Code Playgroud)

有类似的问题。