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

#1 楼

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



mtime —在文件内容更改时更新。在大多数情况下,这是“默认”文件时间。

ctime-当文件或其元数据(所有者,权限)改变时更新

atime-在文件被更新时更新阅读

因此,通常来说,您想要看到的是文件的atime。您可以使用statls来实现。您可以使用ls -lu来执行此操作,尽管我更喜欢使用ls -l --time=atime(几乎所有现代Linux发行版都应支持-t),因为我不经常使用它,当我这样做时,我会更好地记住它。并按时间排序,将noatime标志添加到ls。这样就可以了。

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

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

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

评论


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

–jsbillings
11年8月8日在17:32

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

– jw013
2014年5月2日在1:30



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

–mattdm
2014年5月2日在1:55



ls默认将时间缩短为合理的时间。要以全精度查看时间,可以使用--full-time。

– jlh
19年2月17日在15:27

$ ls -l --time = mtime ls:'--time'的无效参数'mtime'有效参数为:-'atime','access','use'-'ctime','status'尝试'ls- -help”以获取更多信息。

–莫娜·贾拉勒(Mona Jalal)
20年1月6日在17:09

#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 楼

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

如果这是为了程序使用,则解析ls的输出是有问题的。如果您的外壳是zsh,则无论如何都不需要ls:zsh具有通配符来通过增加访问(*(Oa)),inode更改(*(Oc))或修改(*(Om))时间来对匹配进行排序。小写的o会按照年龄的增长顺序进行排序。 ),则可以执行以下操作:如果要一次在多个文件上调用命令,则需要进行更多设置。请注意,act_on_files_by_date $(ls -t)不能像这样工作,因为包含通配符或空格的文件名将在命令替换的结果中扩展。只要文件名不包含换行符或不可打印的字符,以下代码即可工作:

act_on_files_by_date *(Om)


如果要处理任意文件名,则可以在没有办法使用比标准外壳程序更强大的工具的情况下非常困难:zsh,perl,python ...