DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

du -h 的结果用 sort -n 排序,52K 却排在 2G 后面

du -h 输出 K/M/G 后接 sort -n 排序错位,按 GNU human 排序或固定字节单位处理,保留统计范围、精度及读取错误。

用 du -h 查磁盘占用,再接 sort -n,结果可能把 1.0M、2.0G、52K 排成这个顺序。sort -n 比较的是开头的数字,不认识后面的容量单位,因此这里相当于比较 1、2、52。

若只是查看同一次 GNU du 输出里的大目录,可以使用 GNU sort -h;若要比较接近的占用量,优先让 du 输出固定单位再排序,避免显示取整损失细节。

保留 K、M、G 显示,改用 human 排序

下面是只读示例,限定使用支持这些参数的 GNU coreutils,路径替换为实际要检查的目录:

du -h --max-depth=1 -- /srv/data | sort -hr

du 的 -h 负责格式化容量,sort 的 -h 负责比较这种格式,两个选项属于不同程序。-r 将结果反转,让较大的项目在前;需要从小到大时用 sort -h。

--max-depth=1 显示目标目录合计和直接子目录合计,并不代表只扫描一层。du 仍需遍历子目录统计占用,大目录可能产生明显 I/O,应选择合适时段。默认也不逐项显示普通文件;若要逐项分析文件,需要另选范围和输出方式。

结果中的 /srv/data 合计包含子目录,通常会靠前,不能把它当成一个额外子目录再求和。直接传目录会遍历其中的隐藏条目,和由 shell 展开的 * 所选范围也可能不同。

GNU sort -h 按符号、单位后缀及数值比较,适合一次 du 的一致缩放输出。不要把任意混合的 1024M、1G 文本当作精确换算后的字节大小,也不要混合不同单位约定的报表后直接排序。

要保留比较精度,先用固定单位

人类可读输出会取整,两个不同占用量可能都显示成同一个值。需要区分接近的目录时,可以先以固定的字节单位统计:

du --block-size=1 --max-depth=1 -- /srv/data | sort -nr

此时每行开头都是同一单位的整数,sort -n 能直接比较,-r 仍表示从大到小。--block-size=1 改的是显示单位,仍统计文件系统占用;不要换成 du -b 后继续声称统计口径相同,GNU du 的 -b 同时采用 apparent size,稀疏文件等情形会有明显差异。

如果后续还要换回易读单位,应在排序之后转换显示,而不是先丢失精度再排序。这个变化只影响报表,不改变文件内容,没有理由为了排列结果清理文件或修复文件系统。

排序正常,不代表统计范围完整

留意 du 输出到标准错误的权限拒绝、文件消失等信息。管道中的 sort 成功返回,不足以证明前面的统计完整;应保留并核对 du 的错误和状态。若统计期间文件仍在变化,两次执行的数值也可能变化。

本文示例按每行一个路径阅读。文件名含换行时,普通换行输出不能可靠表示完整记录,GNU du 可用 -0 输出 NUL 分隔,sort 对应使用 -z;后续展示或处理工具也必须支持同样的分隔方式,不能只在其中一端修改。

在精简系统、BusyBox 或其他 sort 实现上,先确认 -h 是否可用;不要把 GNU 扩展当成所有环境都具备的标准参数。固定单位排序也需核对当地 du 支持的输出方式。

验收时以单位差别明显的条目确认方向正确,再核对接近条目是否需要固定单位的细分结果。保持同一统计路径、权限和口径,确保没有忽略读取错误。恢复原命令只会恢复旧报表方式,不会涉及数据回退。