上次打开文件的时间

上次打开文件的时间

是否可以获取文件上次打开的时间并按这些时间对目录中的所有文件进行排序?

答案1

这取决于您所说的“打开”的含义,但总的来说,是的。通常记录三个时间戳:

  • mtime— 文件内容更改时更新。在大多数情况下,这是“默认”文件时间。
  • ctime— 文件更新时或者其元数据(所有者、权限)发生变化
  • atime— 读取文件时更新

所以,一般来说,你想看到的是atime文件的内容。你可以用stat或 with 来得到它ls。你可以使用ls -lu它来做到这一点,尽管我更喜欢使用它ls -l --time=atime(几乎所有现代 Linux 发行版都应该支持它),因为我不经常使用它,而且当我使用它时我可以更好地记住它。并种类按时间,将-t标志添加到 ls 中。所以就这样吧。

不过,有一个很大的警告。每次读取文件时更新 atime 会导致大量通常不必要的 IO,从而降低速度。因此,大多数 Linux 发行版现在默认使用noatime文件系统挂载选项,这基本上会杀死 atimes,或者 else relatime,只有在超过限制后(通常每天一次)或者文件自上次读取以来实际被修改时才会更新 atimes。您可以通过运行命令来查看这些选项是否处于活动状态mount

另请注意,访问时间是按 inode 计算的,而不是按文件名计算的,因此如果您有硬链接,则从其中读取将更新引用同一文件的所有名称。

并且,请注意C不是“创造”; Unix/Linux 文件系统不会跟踪创建过程,这看起来很奇怪,但实际上是有道理的,因为文件系统无法知道它是否是原始文件——也许该文件是四十年前创建的并复制到这里的。事实上,许多文件编辑器的工作方式是在原始文件上制作副本。如果您需要该信息,最好使用版本控制系统,例如git.


十年后的一个小更新:一些文件系统,如 btrfs,包含第四个时间戳:

  • birth,或者有时但不一致,btime——这明确是一个“文件创建时间戳”

...至少在statx(2)系统调用手册页中是这样。总体而言,它的记录似乎相当稀疏​​。它确实遇到了同样的问题,导致它首先被排除在外:什么确切地是什么意思?考虑:

$ echo > foo; stat foo|grep Birth
 Birth: 2022-04-30 02:38:19.084919920 -0400
$ cp foo foo.tmp; mv foo.tmp foo; stat foo|grep Birth
 Birth: 2022-04-30 02:39:00.950269045 -0400

在这里,我创建了一个文件,然后将其复制到一个临时文件中,然后将其移回。这会更改“出生”时间。对吗?也许吧!我不确定这是否真的有用,至少对人类来说不是。但无论如何,为了完整性:这是现代系统上可能可用的东西。

答案2

ls -ltu列出所有文件,按访问时间显示和排序。

man ls

-u     with -lt: sort by, and show, access time with -l: show access
       time and sort by name otherwise: sort by access time

答案3

find命令最适合此目的。请参阅-ctime-mtime、 和-atime选项

答案4

以下命令根据文件的访问时间(即 atime)对文件进行排序。

ls -lt --time atime

相关内容