ls cmd 未按我需要的顺序显示文件和目录

ls cmd 未按我需要的顺序显示文件和目录

我有一个 mymid_LS 脚本:

#!/bin/sh
ls -pt

它应该列出所有文件和目录(未隐藏)并按修改时间顺序对它们进行排序。

我使我的脚本可执行:

chmod 755 my_midLS

我创建了 3 个目录和 2 个文件:

$>mkdir dir00 dir01 dir02
$>touch file00 file01

它应该按以下顺序显示文件:

$>./my_midLS
file01  file00  dir02/  dir01/  dir00/  my_midLS

但它按以下顺序显示:

file00  file01  dir00/  dir01/  dir02/  my_midLS

唯一的问题是文件和目录显示相反......

如何修复要显示的文件和目录的顺序?

答案1

如果将短sh脚本转换为zsh脚本,则可以要求zshshell 按照您想要的顺序对名称进行排序:

#!/bin/zsh

ls -p -fd -- *(om)

这里,(om)是一个全局限定符,它改变前面模式的行为。 om意思是“按上次修改时间排序”。然后,我ls -fd使用此名称列表进行调用,用于-f停止ls更改顺序并且-d不列出目录的内容。

除了ls命令之外,您还可以使用

print -rC1 -- *(Nom)

在单列 ( -C1) 中打印列表。停止解释反斜杠序列-r。in glob 限定符的作用类似于printin ,即如果没有匹配,它会使模式扩展为空(而不是生成错误)。Nnullglobbash

答案2

如果这是在 Linux 系统上,那么您就是 Linux 内核错误的受害者。

在 UNIX 上,文件时间戳是通过uniquetime()每次使用时增加秒的小数部分的函数创建的。

即使系统时钟不是很细粒度,这也会为不同的文件系统操作授予唯一的文件时间戳。

然而,在 Linux 上,为多个文件系统操作获取相同的时间戳似乎是很常见的。

当时间戳相等时,文件按字母顺序排序,这就是您所观察到的。

相关内容