查找大文件与大目录:du 与 find 的组合
发布时间:2025-12-05 08:06       
更新时间:2025-12-06 01:25
磁盘报警来得总是很突然。定位大文件不需要装额外工具,du 和 find 组合就够,按下面的顺序做,十分钟能定位九成问题。
## 第一步:定位大目录
从根往下逐层看,只看两层:
```
sudo du -h --max-depth=2 / | sort -rh | head -20
```
--max-depth 控制汇总深度,sort -rh 按人类可读的大小倒序。哪一层异常大,就进入那一层再跑一遍;在当前目录里只想快速看个大概,du -sh * | sort -rh | head 即可。常见的空间大户:/var/log(日志没轮转)、/var/lib/docker(镜像与容器数据)、应用自己的数据目录。拿不准某目录归谁管,看里面的文件名和修改时间,基本能猜出是哪个业务在写。
## 第二步:目录里找具体文件
锁定目录后用 find 列出超过指定大小的文件:
```
sudo find /var/log -type f -size +100M -exec ls -lh {} \;
```
+100M 表示大于 100MB,-type f 只要普通文件。想按时间加一层过滤,再加 -mtime +30(30 天未修改),老日志优先处理。全盘扫描时建议加 -xdev,例如 find / -xdev -size +500M,避免跨进挂载的其它文件系统把结果搅乱。结果按修改时间排个序,越老的文件越可能是能清的存量。
## 第三步:按顺序清理
人肉清理的建议顺序:先清已压缩的旧日志和轮转留下的历史档;再截断仍在写入的大日志(echo > 文件,别 rm,原因见 lsof 一篇的说明);然后清包管理缓存(yum clean all、apt clean);容器环境用 docker system df 先看占用,确认无用的镜像再 prune;系统日志可用 journalctl --vacuum-size=200M 收缩。每删一类,df -h 复查一次增量,心里有账,删之前确认文件属于哪个业务,重要目录动手前先 ls -lh 留一份清单。
## 常见报错
du 结果和 df 对不上,通常是文件被删除但进程还握着句柄,sudo lsof | grep deleted 能抓到;du 遍历报 Permission denied,前面加 sudo 或换 root 执行。还有一种情况是 NFS 挂载卡住导致 du 停住不动,加 -x 不进入外部挂载点就能绕开。清理完成后,把 logrotate 配置补上,比每次手工救火有用得多,轮转策略按业务量定,日均几百 MB 的日志保留两周左右是常见选择。