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

Vil*_*lle 6 command-line find timestamps files

如何-atime以毫秒、秒或分钟为单位进行设置?默认为天:

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

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

find . -atime 0.042 -print
Run Code Online (Sandbox Code Playgroud)

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

我正在使用 Ubuntu 16.04。

mat*_*tdm 10

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

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

因此,您可能想要为相关文件系统更改它,或者寻找另一种方法。incrond是一种设置脚本以触发文件系统活动而无需编写自己的守护程序的便捷方法。


Sté*_*las 8

请注意,当您这样做时-mtime <timespec>,会<timespec>检查文件在find开始时的年龄。

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

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

话虽如此,有几个选择。

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

find . -atime -1s
Run Code Online (Sandbox Code Playgroud)

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

zsh

ls -ld -- **/*(Dms-1)
Run Code Online (Sandbox Code Playgroud)

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

touch -ad '0.5 seconds ago' ../reference
find . -anewer ../reference
Run Code Online (Sandbox Code Playgroud)

或者使用最新版本的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
    }, ".")'
Run Code Online (Sandbox Code Playgroud)