it-swarm.cn

上次打开文件

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

101
student

这完全取决于您“打开”的意思,但总的来说,是的。通常记录三个时间戳:

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

因此,通常来说,您要查看的是文件的atime。您可以使用statls来获得。您可以使用 ls -lu可以做到这一点,尽管我更喜欢使用ls -l --time=atime(几乎在所有现代Linux发行版中都应支持),因为我不经常使用它,当我这样做时,我会更好地记住它。然后按时间到sort,添加-t标记为ls。所以你去了。

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

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

并且,请注意c不是“创造”; Unix/Linux文件系统没有跟踪创建过程,这看起来很奇怪,但实际上是有道理的,因为文件系统无法知道它是否是原始文件-也许文件是40年前创建并复制到这里的。而且,实际上,许多文件编辑器都是通过在原始文件上进行复制来工作的。如果您需要这些信息,最好使用git之类的版本控制系统。

182
mattdm

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
21
Shawn J. Goff

find命令最适合此操作。见-ctime-mtime-atime选项

4
GBH

如果您的清单供人消费,请在日期排序标志之一中使用ls-tu表示访问(读取)时间,仅-t表示修改(写入)时间或-tc表示inode更改时间)。有关更多信息,请参见 mattdm的答案 (尤其是有关-a-c定义的警告)。

如果这是为了程序使用,则 解析ls的输出是有问题的 。如果Shell是zsh,则无论如何都不需要ls:zsh具有通配符来通过增加访问(*(Oa)),inode更改(*(Oc))或修改来对匹配项进行排序(*(Om))时间。小写o按年龄增长排序。

act_on_files_by_date *(Om)

否则,如果您知道文件名不包含任何换行符或不可打印的字符(在当前区域设置中),则可以执行以下操作

ls -t | while read -r name; do act_on_one_file "$name"; done
ls -t | xargs -I {} act_on_one_file {}

如果要一次在多个文件上调用命令,则需要更多设置。请注意,act_on_files_by_date $(ls -t)不能像这样工作,因为包含通配符或空格的文件名将在命令替换的结果中扩展。只要没有文件名包含换行符或不可打印的字符,以下代码即可工作:

IFS='
'
set -f
act_on_files_by_date $(ls -t)
set +f
unset IFS

如果您要处理任意文件名,那么您将不易使用比标准Shell更强大的工具:zsh,Perl,python…