![按编号对目录文件进行排序](https://linux22.com/image/11542/%E6%8C%89%E7%BC%96%E5%8F%B7%E5%AF%B9%E7%9B%AE%E5%BD%95%E6%96%87%E4%BB%B6%E8%BF%9B%E8%A1%8C%E6%8E%92%E5%BA%8F.png)
我有这个目录
$ 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