用 du -shx * | sort -rh 可准确定位当前目录下最大的子文件夹,-x 防跨文件系统,--exclude 可跳过 node_modules 等干扰项,配合 2>/dev/null 屏蔽权限错误。

直接用 du -shx * | sort -rh 就能准确定位当前目录下最大的子文件夹,加 --exclude 跳过 node_modules、.git 等干扰项,再配合 df -h 先看哪块盘真满了——不先做这步,后面所有查找都是盲扫。
怎么快速定位一级子目录中谁最占空间
很多人一上来就 du -sh /,结果等三分钟只看到一堆“Permission denied”,根本没法判断。真正有效的起点是限定层级、过滤错误、只看一级:
-
du -shx /* 2>/dev/null | sort -rh | head -n 5:查根目录下前 5 大一级子目录,-x防跨文件系统,2>/dev/null屏蔽无权访问的报错(如/proc、/sys) - 如果当前在
/var下怀疑日志吃空间:du -shx /var/* 2>/dev/null | sort -rh | head -n 3 - 注意:
sort -rh中的-h必须和du -h匹配,只用sort -rn会把10G排在2G前面(字符串比较)
为什么 du -sh * 比 find + du 或 ls -lSh 更可靠
ls -lSh 只列单个文件大小,不统计目录总和;find /path -type d -exec du -sh {} \; 每个目录都重新递归扫描,深目录下性能断崖式下跌。而 du -sh 是原生命令,内部缓存中间结果,一次遍历完成全部汇总。
-
du -sh统计的是实际磁盘占用(含硬链接去重),更贴近“删了能腾多少空间”这个真实目标 -
find /path -type f -size +1G找的是逻辑大小,且可能扫到/proc伪文件或跨挂载点(必须加-xdev) - 若遇到
Argument list too long错误(比如du -sh *报错),改用:find . -maxdepth 1 -type d -print0 | xargs -0 du -sh | sort -rh
清理前必须绕开的三个坑
看到 /var/log/journal 占了 6G,别急着 rm -rf;发现 nginx/access.log 有 4G,也别直接 rm——这些操作极大概率不释放空间,甚至导致服务异常。
- systemd 日志必须用
journalctl --vacuum-size=500M清理,删目录会导致journalctl后续无法读取 - 正在被进程写入的日志文件(如
access.log),rm后 inode 仍被占用,空间不释放;应改用truncate -s 0 /path/to/file或> /path/to/file - 清完要验证:
df -h看分区使用率是否下降;如果没变,说明有“幽灵文件”(已删但未关闭),用lsof +L1查找并重启对应进程
最容易被忽略的其实是 -x 和 --exclude 的组合使用——没它,你可能把 /boot 或 /mnt/backup 的大小算进 / 的统计里,然后去删一个你根本管不着的挂载点。











