查大文件要删得准、删得稳:先用df -h确认真实满载分区,若df与du差异大则执行lsof +L1查已删未释文件;再用du -shx分层定位大户;接着用带-xdev等约束的find精准捕获大文件并lsof验证后再操作;最后可用ncdu交互式清理。

查大文件不是为了删得快,而是要删得准、删得稳。磁盘告警时最常踩的坑,是直接 rm -rf 看起来大的目录,结果空间没释放、服务还挂了。真正有效的路径是:先看哪里真满了,再分层定位,最后安全清理。
第一步:确认哪个分区真的满了
别跳过这步——很多“满”其实是假象。运行:
-
df -h查整体使用率,重点关注/、/var、/home - 如果某分区显示 95%+,但
du -sh /path总和小一大截,说明存在“已删除但未释放”的幽灵文件 - 此时立刻执行
lsof +L1,找带(deleted)标记的文件,比如/var/log/nginx/access.log (deleted)
第二步:分层定位占用大户
从分区一级一级往下钻,避免全盘扫描耗时又报错:
- 查根目录下前 5 大子目录:
du -shx /* 2>/dev/null | sort -rh | head -5(-x防跨挂载点) - 若
/var异常大,继续:du -shx /var/* 2>/dev/null | sort -rh | head -3 - 发现
/var/log/journal占多?用journalctl --disk-usage看实际用量,再journalctl --vacuum-size=500M安全收缩 - 遇到 Docker?先
docker system df,再docker system prune -f,别手动删/var/lib/docker/overlay2
第三步:精准捕获单个大文件(避开误删)
不用 find / -size +1G 这种危险命令,加约束才可控:
- 限定范围且不跨分区:
find /var -xdev -type f -size +500M -exec ls -lh {} \; - 过滤老旧日志:
find /tmp -type f -size +100M -mtime +7 - 只匹配归档日志(不碰正在写的):
find /var/log -type f -name "*.log.*" -size +100M - 看到目标后,先
lsof /path/to/file确认是否被进程占用;没被占用再删,否则优先truncate -s 0 /path/to/file
第四步:用 ncdu 交互式验证和清理
适合新手或复杂目录结构,比纯命令更直观:
- 安装:
apt install ncdu(Debian/Ubuntu)或yum install ncdu(RHEL/CentOS) - 启动:
ncdu --exclude /proc --exclude /sys --exclude /dev / - 进入后按
d可删除当前选中项,按u可向上退一级,按q退出不执行 - 注意:ncdu 默认不递归扫描符号链接,也不统计 /proc 等虚拟文件系统,结果更贴近真实磁盘占用


















