du -sh --max-depth=1 用于统计当前目录下各直接子目录(不含自身)的磁盘占用总量,需配合 sort -hr 排序、-x 限制文件系统、--exclude 过滤干扰项,并重定向错误输出以确保结果准确可靠。

du -sh --max-depth=1 是最直接有效的命令,但默认输出无序、不含隐藏目录、可能跨文件系统——需要加参数控制范围并配合 sort 才能得到可靠排行。
只看一级子目录体积,不递归进深层
用 --max-depth=1 限定只统计当前目录下的直接子目录(不含自身),避免把 /var/log/journal 这类深层路径的体积错误算到 /var 头上:
– 必须加 -s 汇总每个子目录总量,否则会列出所有内部文件
– -h 让结果可读(G/M/K),但排序时需用 -hr(human-readable reverse)才正确
– 示例:du -sh --max-depth=1 /var/ | sort -hr
排除挂载点和干扰目录
默认 du 遇到其他挂载点(如 /proc、/mnt/backup)会继续扫描,导致结果失真或权限报错:
– 加 -x(等价于 --one-file-system)强制不跨文件系统
– 用 --exclude 过滤常见干扰项:--exclude="node_modules" --exclude=".git"
– 注意路径末尾斜杠:写 /path/*/ 比 /path/* 更安全,能自动跳过同名文件
排序失效的三个常见原因
sort -hr 看似简单,但实际容易失败:
– 输入含非 du 输出行(比如权限错误提示)会导致排序乱序,必须重定向 2>/dev/null
– 如果用了 du -sh *,而当前目录有空格或特殊字符的子目录名,* 展开会出错;改用 for d in */; do [ -d "$d" ] && du -sh "$d"; done 更健壮
– sort -hr 在部分老系统(如 CentOS 6)不支持,可退化为 du -sk --max-depth=1 | sort -nr(以 KB 为单位)
想同时看文件数和体积?别硬塞进一条命令
Linux 没有原生双字段 human-readable 排序,强行拼接易出错:
– 先用 du -sh --max-depth=1 /path/*/ 2>/dev/null | sort -hr 稳准快
– 若真需文件数,单独跑:find /path/*/ -maxdepth 1 -type f | wc -l,再用脚本对齐目录名
– 最后合并排序时,第一列必须是纯数字(如用 du -sk),否则 sort -k1,1n 才可靠
du 默认行为太“诚实”:它不忽略任何东西,也不自动适配你的意图。每次执行前,先问自己一句——这个目录下有没有挂载点?有没有我根本不想扫的巨量小文件?有没有权限受限的子目录?答案决定了你得加几个 -x、几个 --exclude、要不要重定向 stderr。


















