Shell Daily 2026-01-14: 智能排序 (Sort Version/Human)
Shell Daily 2026-01-14: 智能排序 (Sort Version/Human)
在处理文件列表或统计数据时,我们经常会遇到排序逻辑的“反直觉”时刻。
比如你列出了一堆软件包:v1.2, v1.10, v1.9。如果用默认的文本排序 (sort),v1.10 竟然会排在 v1.2 的前面(因为字符 1 比 2 小)。
又比如你用 du -h 查看文件大小,想找出最大的文件。如果你用普通的数字排序 (sort -n),500K 居然会排在 10G 后面(因为 500 > 10)。
为了解决这些非纯数字的排序难题,GNU Sort 提供了两个极其聪明但常被忽略的参数:-V 和 -h。
怎么用
-
-V(Version):专门用于处理“版本号”逻辑(自然排序),能正确识别数字混合字符串的大小顺序。 -
-h(Human-numeric):专门配合du -h等命令,能识别 K, M, G, T 等单位并正确比较。 -
兼容性:Linux (GNU sort) 标配。macOS (BSD sort) 原生支持
-h,但-V可能需要安装 coreutils (gsort)。
适用场景
- 版本管理:对 Tag、分支名或备份文件(如
backup-1.tar,backup-10.tar)进行排序。 - 空间清理:找出占用磁盘空间最大的几个目录。
示例 1:版本号排序 (-V)
这是运维脚本中最容易踩坑的地方。默认排序会让 v10 排在 v2 之前,导致你发布的“最新版”可能是个旧版本。
$ cat tags.txt
v1.2.zip
v1.10.zip
v1.9.zip
# 错误示范:默认排序
$ sort tags.txt
v1.10.zip <-- 错啦!1.10 应该比 1.9 大
v1.2.zip
v1.9.zip
# 正确示范:版本排序
$ sort -V tags.txt
v1.2.zip
v1.9.zip
v1.10.zip <-- 完美归位
示例 2:磁盘占用排序 (-h)
du -h 很适合人类阅读,但对排序命令很不友好。配合 sort -h,你可以既保留易读的单位,又能得到正确的顺序:
# -h: 识别人类可读格式 (1K, 1M, 1G)
# -r: 逆序 (Reverse),把最大的放前面
du -sh * | sort -rh | head -5
# 输出示例:
# 15G docker-data
# 800M logs
# 50K scripts
(注:掌握这两个参数,你就再也不用为了排序,被迫把 du -h 换成 du -k 去数那一长串零了。)

浙公网安备 33010602011771号