上次打开文件


94

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

Answers:


172

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

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

因此,通常来说,您要查看的是atime文件的。您可以使用stat或来获得lsls -lu尽管我更喜欢使用ls -l --time=atime(几乎所有现代Linux发行版都应支持),但您可以使用它来执行此操作,因为我不经常使用它,并且这样做的时候我会更好地记住它。和排序的时候,添加-t标志LS。所以你去了。

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

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

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


9
如果可以的话,我会给您超过+1,仅是因为不将ctime称为“创建时间”。
jsbillings

2
根据安装手册,relatime与每日限制无关,而只是查看对于mtime和ctime 的atime 。如果atime早于mtime或ctime,则更新atime。如果一个时间比两个时间都新,那么它就一个人呆着。这样做的目的是保留atime与mtime / ctime之间的关系,因为某些应用程序使用该信息,例如mutt,以查看自上次更新以来是否已读取您的邮箱。
jw013

1
@ jw013自2.6.30内核以来就是这种情况。确实,某些较早的发行版可能没有此行为。(但是对于Fedora这样的发行版,甚至三年前我写这个答案的原始版本时也是如此。)寻找更新的mount联机帮助页。
mattdm

1
ls默认情况下将时间缩短到合理的精度。要完全精确地查看时间,可以使用--full-time
jlh

19

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

4

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


3

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

如果这是为了程序消耗,则解析输出ls是有问题的。如果您的外壳是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…

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.