按编号对目录文件进行排序

按编号对目录文件进行排序

我有这个目录

$ ls
0    2    4    config.yml
1    3    catalog.svg

子目录从0开始编号。我需要获取最大数量。

当尝试时ls | sort -n我得到

0
catalogIcon-gitlab.svg
config.yml
1
2
3
4

这里发生了什么事?为什么c在0和1之间?

如何编写命令来获取顶部数字?

系统:bash、MacOS

答案1

尝试以下方法获取最大编号目录:

max=$(printf "%s\n" */ | sort -n | tail -1)
echo "${max%/}"

答案2

sort -n“根据字符串数值”排序;在这种情况下,当sort尝试对数字与字母进行数字比较时,它会回退到memcmp相应的字节,将c(ASCII 99)放在0(ASCII 48)之后。使用 GNU sort--debug选项,您可以看到失败的发生:

$ ls |sort -n --debug
sort: using ‘en_US.UTF-8’ sorting rules
0
_
_
catalogIcon-gitlab.svg
^ no match for key
______________________
zoo
^ no match for key
___
1
# ... continues ...

对于仅 bash 的解决方案,我将使用循环(假设,正如您所指出的,目录从 开始0):

highest=-1
for d in *; do [[ -d "$d" ]] || continue; [[ "$d" -gt "$highest" ]] && highest=$d; done
printf '%s\n' "$highest"

答案3

ls默认情况下已经按词法排序。当它们以这样的简短形式排列时,你只是以错误的顺序阅读它们。向下阅读每一列,然后阅读下一列。要查看实际ls使用的词法顺序,请让它每行输出一个对象:

$ ls -1
0
1
2
3
4
catalog.svg
config.yml

答案4

怎么样?:

ls -1v
0
1
2
3
4
12
23
catalog.svg
config.yml

v 表示version排序顺序。

要获取最后一个(最大)数字,请仅选择数字:

$ ls -1v | grep -x '[0-9]*'
0
1
2
3
4
12
23

并尾随它:

$ ls -1v | grep -x '[0-9]*' | tail -n 1
23

唯一的 bash 解决方案:

$ max=0; for d in */; do d=${d%/}; [[ d -gt max ]] && max=$d; done; printf '%d\n' "$max"
23

相关内容