关键在“找得准+删得稳”:先用lsof +l1查已删未释文件,再用du -sh --max-depth=1配合sort定位隐形巨无霸,结合find加-xdev/-mtime等约束精准捕获超大文件,最后用ncdu交互式安全清理。

直接定位并清理隐藏大文件,关键不在“找得全”,而在“找得准+删得稳”。很多空间被吃掉,根本不是明面上的大目录,而是被进程锁住的已删文件、深层缓存、日志碎片或容器残留——它们不会出现在常规 ls 或简单 du 中。
先确认是不是“幽灵文件”在作怪
当 df -h 显示磁盘 95%+ 满,但 du -sh / 统计总和却小一大截,基本就是“已删除但未释放”的文件在占坑。这类文件在 /proc/*/fd/ 下还挂着句柄,du 看不见,df 却算它。
- 运行
lsof +L1,列出所有状态为 deleted 的打开文件 - 重点关注输出里的 PID 和路径,比如
/var/log/nginx/access.log (deleted) - 若服务可重启,直接
systemctl restart nginx,空间立刻释放 - 若不能重启,进
/proc/[PID]/fd找对应 fd 编号(如3),执行echo > 3清空内容
深挖目录级“隐形巨无霸”
有些大占用是层层嵌套堆出来的,比如 /var/lib/docker/overlay2、/home/user/.cache、/var/log/journal,单个文件不大,合起来几十GB。用 du 加防护参数才能稳准狠:
-
du -sh --max-depth=1 /var/* 2>/dev/null | sort -hr | head -10—— 忽略权限错误,只看一级子目录 - 发现
/var/lib异常大?再往下:du -sh --max-depth=1 /var/lib/* 2>/dev/null | sort -hr | head -10 - 遇到 Docker?先
docker system df查用量,再docker system prune -f清理无用镜像、构建缓存、停止容器 - 系统日志膨胀?
journalctl --disk-usage看 journald 占用,journalctl --vacuum-size=500M限制上限
精准捕获单个超大文件(避开误删陷阱)
别一上来就 find / -size +1G,既慢又危险。加约束才可控:
- 限定分区:
find /var -xdev -type f -size +500M -exec ls -lh {} \;(-xdev防跨挂载点) - 过滤老旧文件:
find /tmp -type f -size +100M -mtime +7(避开正在写入的日志) - 排除活跃日志:
find /var/log -type f -name "*.log.*" -size +100M(只匹配syslog.1、nginx/error.log.20260901.gz这类归档,不碰access.log) - 看到目标后,先
lsof /path/to/file确认是否被占用;没被占用再删,否则优先truncate -s 0 /path/to/file
用 ncdu 交互式排查(适合新手上手)
比纯命令更直观,还能边看边删,但要注意默认行为:
- 安装:
apt install ncdu(Debian/Ubuntu)或yum install ncdu(CentOS/RHEL) - 扫描:
ncdu /var(别直接扫/,太耗时) - 进入后按
s按大小排序,→进入子目录,d删除选中项(会二次确认) - 注意:ncdu 默认递归统计,首次运行可能卡顿,耐心等它建完索引











