我有一个 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
脚本,则可以要求zsh
shell 按照您想要的顺序对名称进行排序:
#!/bin/zsh
ls -p -fd -- *(om)
这里,(om)
是一个全局限定符,它改变前面模式的行为。 om
意思是“按上次修改时间排序”。然后,我ls -fd
使用此名称列表进行调用,用于-f
停止ls
更改顺序并且-d
不列出目录的内容。
除了ls
命令之外,您还可以使用
print -rC1 -- *(Nom)
在单列 ( -C1
) 中打印列表。停止解释反斜杠序列-r
。in glob 限定符的作用类似于print
in ,即如果没有匹配,它会使模式扩展为空(而不是生成错误)。N
nullglob
bash
答案2
如果这是在 Linux 系统上,那么您就是 Linux 内核错误的受害者。
在 UNIX 上,文件时间戳是通过uniquetime()
每次使用时增加秒的小数部分的函数创建的。
即使系统时钟不是很细粒度,这也会为不同的文件系统操作授予唯一的文件时间戳。
然而,在 Linux 上,为多个文件系统操作获取相同的时间戳似乎是很常见的。
当时间戳相等时,文件按字母顺序排序,这就是您所观察到的。