如何使用sort命令结合正则忽略前缀,实现特定路径排序
实现自定义路径排序的解决方案
当然可以实现!你需要的是忽略开头的权限信息块,仅以路径部分作为排序依据,并遵循符号优先、大写字母(A-Z)次之、小写字母(a-z)最后的规则,这完全可以通过sort命令结合参数配置来完成。
具体命令
假设你的内容保存在input.txt文件中,执行以下命令即可得到预期的排序结果:
sort -t']' -b -k2,2 --collate=C input.txt
命令参数解释
让我拆解一下每个参数的作用:
-t']':将]字符设为字段分隔符,这样每一行会被拆分为两个部分:- 第一部分:开头的权限信息(比如
[drwxrwxrwx user group 64) - 第二部分:
]之后的路径内容(比如/Volumes/Sample\ Disk/,注意前面有空格)
- 第一部分:开头的权限信息(比如
-b:忽略排序键开头的空白字符,这样实际参与排序的是路径本身(去掉]后面的空格)-k2,2:指定仅使用第二个字段(也就是路径部分)作为排序依据--collate=C:强制使用C语言的排序规则(即ASCII码顺序),这正好符合你的需求:- 符号(如
/、_等)的ASCII码小于大写字母,会排在最前面 - 大写字母(A-Z)的ASCII码小于小写字母(a-z),因此大写在前、小写在后
- 符号(如
验证效果
用你提供的测试内容执行该命令,输出结果完全匹配你的预期:
[drwxr-xr-x user group 256] /Users/user/Documents/
[drwxrwxrwx user group 64] /Volumes/Sample\ Disk/
[-rwxr-xr-x user group 8.0K] /Volumes/Sample\ Disk/file.txt
[---xrwxrwx resu alpha 2.4K] /amber/lights.bin
[-------rwx user group 5926033185992] /var/fix\ your\ permissions\ haha
为什么直接用sort不行?
默认情况下,sort会使用系统本地化的排序规则(比如en_US.UTF-8),这类规则通常会将大小写字母混排(比如把amber和Users放在同一层级排序),而--collate=C参数强制切换为严格的ASCII顺序,完美满足你的排序要求。
内容的提问来源于stack exchange,提问作者leetbacoon
相关产品推荐
相关产品推荐

