使用Bash,是否可以获得从未读取过的文件列表(或者修改时间与读取时间相同)?

使用Bash,是否可以获得从未读取过的文件列表(或者修改时间与读取时间相同)?

比如说,如果有一个文件夹,是否可以获取该文件夹及其子文件夹中从未被读取过一次的所有文件的列表?

但这可能吗? (因为“上次访问时间”实际上是在写入文件时更新的)。如果是这种情况,那么获取上次访问时间与上次修改时间相同的所有文件的列表也可以。

答案1

以下perl脚本将查找所有 atime <= mtime 的文件(即自上次写入以来未读取的文件),并打印其完整路径:

$ perl -MFile::Find=find -e 'find {
   wanted => sub {my @s=stat; print "$_\n" if $s[8]<=$s[9]},
   no_chdir => 1
}, @ARGV' files and dirs ...

或者,使用 GNU find 的不可移植功能:

$ find [files and dirs ...] -printf '%A@ %T@  %p\n' |
  awk '$1 <= $2 { print substr($0, index($0, "  ")+2) }'

find版本更加精确,因为它还将处理 atime 和 mtime 之间的亚秒级差异。它不会处理包含换行符的文件名——这可以通过使用-printf '...\0'GNU awk ( gawk) with RS="\0";来修复。但随后必须决定输出格式,其中嵌入的换行符将清晰显示。

您可以从其中任何一个bash;纯粹地做这件事bash留给读者作为练习;-)

关于文件时间戳的注意事项:

所有这一切都假设 atime 确实在工作;如果文件系统是用MS_NOATIME.

当文件刚刚打开或写入时,atime 不会更新,而是仅在以一种或另一种方式读取时(通过 read(2)、pread(2)、execve(2) 等)更新。

另外,unix 中没有“创建时间”; ctime 是状态的时间改变每当其元数据发生更改或写入文件时,它将被更新。

最近的 Linux 内核(> 4.11)还知道文件的创建/诞生时间,可以通过统计数据(2)界面。但这是非标准的,并且在大多数发行版中尚不受支持。

相关内容