本文目录导读:

在脚本中对 du 命令的输出进行排序,通常是为了找出占用磁盘空间最多的目录或文件,最常用的方法是将 du 的输出通过管道传递给 sort 命令。
核心排序点在于:sort 默认按字典序排序,而 du 输出的数字是字符串,要对文件大小进行数值排序,必须使用 -n 或 -h 选项。
以下是几种常见的脚本实现方式:
按大小升序排列(从小到大)
du -sk * | sort -n
-s:显示每个目录/文件的总计,不显示子目录详情。-k:以 KB 为显示单位。sort -n:按纯数字(数值)升序排列。
按大小降序排列(从大到小,最常用)
这是清理磁盘空间时最常见的需求。
du -sk * | sort -nr
sort -r:反转排序结果(从大到小)。-n:强制数值排序。
更易读的版本(推荐在脚本中使用):
du -sh * | sort -hr
-h:人类可读格式(如 KB、MB、GB)。sort -h:这是关键。sort -h能理解人类可读的大小后缀(如 1K、2M、3G),并按实际数值排序,这比单独用-n更直观。-r:降序。
注意: sort -h 在 coreutils >= 7.5(2009年后)及所有现代 Linux 发行版、macOS 中均可用,如果你的脚本目标环境非常古老(如旧版 AIX、Solaris),则需用 -k 和 -n 组合。
深入子目录一级并排序
如果只想看当前目录下一级子目录的大小(不包括当前目录下的文件):
du -sh */ | sort -hr
- 只匹配目录,不匹配文件。
显示总大小并指定最大深度
控制 du 的递归深度,避免输出过多。
# 显示 depth 1 以内的所有内容(包括文件),并按大小排序 du -hd1 . | sort -hr # 显示 depth 2 以内的所有目录 du -hd2 . | sort -hr
--max-depth=1或-d1,具体取决于du版本(GNU与BSD/macOS差异),在脚本中推荐使用-d,因为它比--max-depth更通用(macOS 不支持--max-depth)。
一个完整的脚本示例(查找并清理大文件/目录)
#!/bin/bash # 功能:列出当前目录下所有子目录的大小,按大小降序排列,并只显示前10个 echo "================================" echo " Top 10 largest directories in: $(pwd)" echo "================================" du -h -d 1 . 2>/dev/null | sort -hr | head -n 10
说明:
2>/dev/null:屏蔽权限不足导致的错误信息(du无法读取某些目录),使输出更干净(但注意这也会忽略真正的错误)。| head -n 10:只显示前10行。
常见问题与陷阱
| 问题 | 解释 | 解决办法 |
|---|---|---|
| 排序错误 | 使用 du -sh 后接 sort -n,结果出现 1.1G 排在 800M 前面的情况 |
必须使用 sort -h 来识别 K、M、G 单位 |
| 权限不足 | du 遍历 /proc、/sys 或他人的家目录时会报错 |
添加 2>/dev/null 忽略错误(但要谨慎) |
| 递归过深 | 不加 -d 或 --max-depth,du 会输出所有嵌套子目录 |
根据需求设置合适的 -d N 参数 |
| 单位不统一 | 混合使用不同单位(如 KB 和 GB),sort -n 会错误比较 |
要么统一使用 -k,要么使用 sort -h |
总结最佳实践
- 对于人类可读的报告:使用
du -sh * | sort -hr - 对于脚本中需要数值计算的:使用
du -sk * | sort -nr(大小单位为 KB,易于截取字段运算) - 控制深度:使用
-d 1而不是-s,因为-s等于-d 0,看不到下一级。