ls 并按人类数字排序

Tho*_*men 2 ls sort

我创建目录 mkdir site_{1..44}。我想对它们进行排序

site_1
site_2
site_3
site_4
...
site_44
Run Code Online (Sandbox Code Playgroud)

我执行命令 ls | sort -h并且我有

site_1
site_10
site_11
site_12
site_13
site_14
site_15
site_16
site_17
site_18
site_19
site_2
site_20
site_21
site_22
site_23
site_24
site_25
site_26
site_27
site_28
site_29
site_3
site_30
site_31
site_32
site_33
site_34
site_35
site_36
site_37
site_38
site_39
site_4
site_40
site_41
site_42
site_43
site_44
site_5
site_6
site_7
site_8
site_9
Run Code Online (Sandbox Code Playgroud)

我哪里出错了?

Sté*_*las 8

使用 GNU ls

ls -1 -v
Run Code Online (Sandbox Code Playgroud)
ls --format=single-column --sort=version
Run Code Online (Sandbox Code Playgroud)

使用 GNU sort(并假设文件名不包含换行符):

ls | sort -V
Run Code Online (Sandbox Code Playgroud)
ls | sort --version-sort
Run Code Online (Sandbox Code Playgroud)

使用zsh,您还可以使用 glob 限定符对 glob 进行数字排序n

print -rC1 -- *(Nn)
Run Code Online (Sandbox Code Playgroud)

(这里还使用Nullglob 限定符,因此如果没有匹配文件(没有作为*模式的非隐藏文件),它不会打印任何内容,而不是给出错误)。

如果传递给ls,您需要告诉ls禁用它自己的排序(-U/--sort=none与 GNU ls):

ls -ldU -- *(n)
Run Code Online (Sandbox Code Playgroud)

(这里不使用,N因为如果没有传递任何参数,ls将列出.而不是不列出任何内容)。

您还可以使用 使其成为默认值set -o numericglobsort

但也许更好的方法是在文件名中使用 0 填充,以便它们在数字和词法上排序相同:

mkdir site_{01..44}    # zsh, bash, yash -o braceexpand
mkdir site_{1..44%02d} # ksh93
Run Code Online (Sandbox Code Playgroud)

GNU本身对人类可读的大小sort -h进行排序,例如显示为或,例如表示为,因此它在这里没有用。du -hls -sh123456789118M

在你的情况下site_1......不要以看起来像人类可读的大小开始,它们都被视为 0 并排序相同。然而,由于最后的比较,您确实得到了词法排序,它通过词法比较整行来打破联系。

即使您的目录被命名为site_314, site_1.1Ksite_0.9M并且您想根据 后找到的大小对它们进行排序_,您也需要告诉人类可读的大小sort在哪里,以便首先对第一个词法之前的部分进行排序,然后对后面的部分,将其解释为人类可读的尺寸,并带有符合ey 规范的标志。sort -t_ -k1,1 -k2h__hk