在 GNU find
man 中,您可以阅读有关该选项的内容-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:43
,find . -mtime 0
将为您提供 2015 年 10 月 24 日 13:43 至今修改的文件。
为您提供昨天最后修改的文件的更可靠方法是:
find . -newermt 'yesterday 0' ! -newermt 'today 0'
请注意,它包括今天在 00:00:00.0000000000 最后修改的文件,而不是昨天那个时间的文件。不幸的是没有-oldermt
谓词。
请注意,在 glob 中使用zsh
的age
函数如下:
$ autoload age # in ~/.zshrc
$ ls -ld -- *(age,yesterday,)
有类似的问题。