Answers:
这完全取决于您“打开”的意思,但总的来说,是的。通常记录三个时间戳:
mtime
—当文件内容更改时更新。在大多数情况下,这是“默认”文件时间。ctime
—在文件或其元数据(所有者,权限)更改时更新atime
—在读取文件时更新因此,通常来说,您要查看的是atime
文件的。您可以使用stat
或来获得ls
。ls -lu
尽管我更喜欢使用ls -l --time=atime
(几乎所有现代Linux发行版都应支持),但您可以使用它来执行此操作,因为我不经常使用它,并且这样做的时候我会更好地记住它。和排序的时候,添加-t
标志LS。所以你去了。
不过,有一个很大的警告。每次读取文件时更新atime会导致很多通常不必要的IO,从而减慢一切。因此,现在大多数Linux发行版都默认使用noatime
filesystem mount选项,该选项基本上会杀死atimes,否则relatime
只会在超过限制(通常每天一次)或自上次读取以来实际上已修改文件后才更新atimes。您可以通过运行mount
命令来查找这些选项是否处于活动状态。
另外,请注意,访问时间是按索引节点而不是文件名访问的,因此,如果您具有硬链接,则从其中读取将更新引用同一文件的所有名称。
并且,请注意c并非“创造”;Unix / Linux文件系统没有跟踪创建过程,这看起来很奇怪,但实际上是有道理的,因为文件系统无法知道它是否是原始文件-也许文件是40年前创建并复制到这里的。而且,实际上,许多文件编辑器都是通过在原始文件上进行复制来工作的。如果您需要这些信息,最好使用的版本控制系统git
。
mount
联机帮助页。
ls
默认情况下将时间缩短到合理的精度。要完全精确地查看时间,可以使用--full-time
。
如果您的列表供人类使用,请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…