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