我创建目录
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)
(这里还使用N
ullglob 限定符,因此如果没有匹配文件(没有作为*
模式的非隐藏文件),它不会打印任何内容,而不是给出错误)。
如果传递给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 -h
或ls -sh
例如 显示的,其中123456789
例如表示为118M
,所以它在这里没有用。
在你的情况下site_1
......不要从看起来像的开始人类可读的尺寸,它们都被视为0并且排序相同。然而,由于最后的比较,您确实得到了词法排序,它通过词法比较整行来打破联系。
即使您的目录被命名为site_314
, site_1.1K
,site_0.9M
并且您想根据 后找到的大小对它们进行排序_
,您也需要告诉sort
它们在哪里人类可读的尺寸就像sort -t_ -k1,1 -k2h
首先对第一个词法之前的部分进行排序_
,然后对 之后的部分进行排序_
,将其解释为人类可读的尺寸带有h
符合k
ey 规范的标志。