ls 并按人类数字排序

ls 并按人类数字排序

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

site_1
site_2
site_3
site_4
...
site_44

我执行命令 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

我哪里出错了?

答案1

使用 GNU ls

ls -1 -v
ls --format=single-column --sort=version

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

ls | sort -V
ls | sort --version-sort

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

print -rC1 -- *(Nn)

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

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

ls -ldU -- *(n)

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

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

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

mkdir site_{01..44}    # zsh, bash, yash -o braceexpand
mkdir site_{1..44%02d} # ksh93

GNUsort -h本身就是排序的人类可读的尺寸du -hls -sh例如 显示的,其中123456789例如表示为118M,所以它在这里没有用。

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

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

相关内容