`ls -lt` 会遵循准确的 mtime 还是仅遵循大约秒的 mtime?

`ls -lt` 会遵循准确的 mtime 还是仅遵循大约秒的 mtime?

ls -l仅显示文件的修改时间戳(最多秒)。如果两个文件在秒内具有相同的时间戳,但不完全同时修改,则将ls -lt按照准确的 mtime 的顺序或仅在秒内的近似 mtime 的顺序对文件进行排序(因此文件之间的顺序可以是随意的)?

答案1

这在很大程度上取决于ls实施情况。其中 4 个在 GNU/Linux 系统上找到:

$ touch a; touch c; touch b; stat -c %y a c b
2018-01-10 12:52:21.367640342 +0000
2018-01-10 12:52:21.371640148 +0000
2018-01-10 12:52:21.375639952 +0000
  • GNUls,来自 GNU 项目的一个(来自 GNU核心工具收藏)。这是在 Debian(Linux 或 kFreeBSD 内核)、Cygwin 或 Fedora 等 GNU 系统上常见的一种。

    $ gnu-ls -rt
    a  c  b
    
  • ls的从传家宝工具箱,OpenSolaris 工具的一个端口:

    $ heirloom-ls -rt
    a  b  c
    
  • 来自lsAT&T 开源集合,可能是内置的ksh93。另一种有很多奇特的扩展:

    $ ast-ls -rt
    a  c  b
    $ PATH=/opt/ast/bin:$PATH ksh93 -c 'type ls; ls -rt'
    ls is a shell builtin version of /opt/ast/bin/ls
    a  c  b
    
  • busybox(在大多数(通常是嵌入式)基于 Linux 的系统上找到的(或衍生版本)):

    $ busybox ls -rt
    c  b  a
    

因此,其中,GNU 和 astls考虑第二部分的小数部分。其他的则退回到对同一秒内最后修改的文件进行词法比较。只有 busyboxls尊重-r那里。

在我的测试中,FreeBSDls还支持亚秒级精度(前提是它们在 VFS 级别启用,请参阅vfs.timestamp_precisionsysctl)。

zsh的 glob(使用omglob 限定符在修改时间进行排序,Om用于相反顺序)也占用完整时间:

$ echo *(Om)
a c b

[ file1 -nt file2 ],在支持的情况下通常也支持亚秒粒度

答案2

对于 GNU 的ls实现,运行时ls -l将按字母顺序对文件进行排序,并将ls -lt按修改时间的顺序对文件进行排序,最新的在前,以底层文件系统支持的最高精度。您可以使用该--full-time选项进行检查。

因此,要回答您的问题,是的,它可以最大程度地扩展,但前提是您使用-t(否则,它将默认为字母顺序),并且正在使用支持它的实现(请参阅 史蒂芬的回答更多细节)。例如,ext4如果有足够大的索引节点来存储所需的时间戳数据,则可以支持纳秒精度。

答案3

您可以检查是否比较输出

ls -lat

ls -lat --full-time

排序没有任何随意性。

答案4

是的,它会。

为了测试,创建两个时间差很小的文件:

$ touch aa; sleep 0.2; touch bb

检查修改时间:

$ stat -c %y bb aa
2018-01-07 20:51:19.364248042 0000
2018-01-07 20:51:19.072248226 0000

该列表将使用这样的差异:

$ ls -lt aa bb
-rw-r--r-- 1 user user 0 Jan  7 20:51 bb
-rw-r--r-- 1 user user 0 Jan  7 20:51 aa

有了--full-time差异就会一目了然。

$ ls -lt --full-time aa bb
-rw-r--r-- 1 user user 0 2018-01-07 20:51:19.364248042 0000 bb
-rw-r--r-- 1 user user 0 2018-01-07 20:51:19.072248226 0000 aa

相关内容