最快定位“嫌疑目录”应使用du -shx / 2>/dev/null | sort -rh | head -n 10,-x防止跨文件系统,/仅扫描根下一级子项,2>/dev/null屏蔽权限错误,sort -rh按人类可读大小倒序排列,head -n 10快速聚焦前十大目录。

只看当前目录一级子项,最快定位“嫌疑目录”
绝大多数磁盘告警的根源,就藏在根目录或挂载点下的一级子目录里(比如 /var、/home、/usr)。直接递归扫全盘既慢又干扰多。用这句命令秒出结果:
du -shx /* 2>/dev/null | sort -rh | head -n 10
关键点:
-
-x防跨文件系统——避免误入/proc、/sys、/mnt等挂载点,这是生产环境必加项 -
/*匹配根下所有一级目录,不进子层,响应快、结果干净 -
2>/dev/null屏蔽权限错误(如/root、/boot下无读权限的目录),否则命令可能卡住或中断输出 - 中文 locale 下
sort -rh可能错乱,可改用sort -Vr或先转字节:du -sb /* 2>/dev/null | sort -nr | head -n 10
锁定目标后深入一层,快速识别“元凶级”子目录
比如 du 输出显示 /var 占了 18G,但你不知道是 /var/log 还是 /var/lib/docker 在膨胀。这时不要直接 du -sh /var/* —— 它会遍历所有子目录,包括 /var/cache/apt/archives 这类临时缓存,浪费时间。正确做法是:
du -h --max-depth=1 /var 2>/dev/null | sort -rh | head -n 10
说明:
-
--max-depth=1保证只统计/var直接子目录(如log/、lib/、cache/),不进第二层 - 若发现
/var/log异常大,再对它执行同级命令:du -h --max-depth=1 /var/log 2>/dev/null | sort -rh | head -n 5 - 注意:某些路径含空格或特殊字符(如
/var/lib/lxc containers)会导致du报错,此时改用find /var/log -maxdepth 1 -type d -exec du -sh {} \; 2>/dev/null | sort -rh | head -n 5
排除干扰项,避免 du 卡在无意义目录
在 / 或 /home 下执行 du 时,node_modules、.git、/proc、/dev/shm 这些目录要么体积巨大,要么是虚拟文件系统,完全不该计入排查范围。硬等它扫完,不如主动跳过:
du -shx --exclude={node_modules,.git,__pycache__,.cache} /* 2>/dev/null | sort -rh | head -n 10
注意:
-
--exclude是 bash 内建语法,花括号内多个值用逗号分隔,**不能有空格**({a,b,c}✅,{a, b, c}❌) - 路径需匹配
du实际遍历路径:从/开始查,写--exclude="/proc";在/home下查,则写--exclude=".local/share/Trash" -
--exclude不支持通配符(如*.log),要过滤日志文件得换find+du组合
对比 du 和 find -size,什么时候该用哪个
du 统计的是实际磁盘占用(含块对齐、稀疏文件、硬链接重复计数),find -size 查的是文件逻辑大小(stat.st_size)。二者目的不同:
- 查“谁把磁盘撑爆了” → 用
du,因为只有它反映真实空间消耗 - 查“哪些文件逻辑上超大,可能误存了备份包或镜像” → 用
find / -xdev -type f -size +1G 2>/dev/null,速度快、不占 IO - 想兼顾两者?用
find / -xdev -type f -size +500M -exec du -h {} \; 2>/dev/null | sort -rh | head -n 10,但注意-exec ... {} \;效率低于+批量模式
真正容易被忽略的是:du 对硬链接和稀疏文件的处理方式。同一个 inode 被多个硬链接指向时,du 默认只算一次(除非加 --all),而 find -size 每个链接都独立返回。如果你怀疑某类文件被大量硬链接滥用,得单独验证。











