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 的前面(因为字符 12 小)。
又比如你用 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 去数那一长串零了。)

posted @ 2026-01-14 13:52  Terrasse  阅读(1)  评论(0)    收藏  举报