如何以秒为单位设置(查找)atime?

如何以秒为单位设置(查找)atime?

如何设置-atime毫秒、秒或分钟?默认为天:

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

我想每小时运行一次 cron 作业,以检查特定目录中的文件是否在该时间范围内被访问。以小数形式输入时间似乎不起作用,即

find . -atime 0.042 -print

但也许还有更好的解决方案——也许是另一个命令?或者也许这无法完成..用于查找最后修改的文件X分钟 允许-mmin以分钟为单位设置时间。也许缺少这样的访问时间选项意味着信息的存储方式不同?

我使用的是 Ubuntu 16.04。

答案1

使用 GNU find,您可以使用-amin代替-atime.正如您可能猜到的,它是“文件上次访问时间为 n 分钟前”。

也就是说,请注意,大多数现代系统默认使用relatime文件系统选项,该选项仅通过更新文件实际情况来保存元数据写入修改的自上次访问以来或是否已超过阈值(通常为 24 小时)。

因此,您可能想要更改相关文件系统的设置,或者寻找其他方法。因克朗德是一种设置脚本来触发文件系统活动的便捷方法,无需编写自己的守护进程。

答案2

请注意,当您执行此操作时-mtime <timespec>,系统会开始<timespec>检查当时文件的寿命。find

除非您在非常小的目录树中运行它,否则将花费几毫秒(如果不是几秒或几小时)来爬行目录树并对每个文件find执行操作。lstat()因此,小于一秒的精度不一定有多大意义。

另请注意,并非所有文件系统都支持亚秒粒度的时间戳。

话虽如此,有几个选择。

使用find许多 BSD 中的 和 中的一个schily-tools,您可以执行以下操作:

find . -atime -1s

查找上次访问时间不到一秒的文件(与find启动时相比)。

zsh

ls -ld -- **/*(Dms-1)

对于亚秒粒度,使用 GNU 工具,您可以使用参考文件,其 atime 设置为touch

touch -ad '0.5 seconds ago' ../reference
find . -anewer ../reference

或者使用最新版本的perl

perl -MTime::HiRes=lstat,clock_gettime -MFile::Find -le '
  $start =  clock_gettime(CLOCK_REALTIME) - 0.5;
  find(
    sub {
      my @s = lstat $_;
      print $File::Find::name if @s and $s[8] > $start
    }, ".")'

相关内容