df -h 警告磁盘 90%,但你不知道是哪个目录、哪个文件在涨。先给结论:
从根开始逐层
du找大目录,再用find/ncdu定位超大文件。这套"自上而下"的套路几分钟就能把大头锁定。
方法一:du 逐层下钻(最通用,不依赖额外工具)
先看根下各目录谁最大:
du -xhd1 / 2>/dev/null | sort -h | tail -20
参数:
-x不跨文件系统(排除 /proc、独立分区),-h人性化大小,-d1只列一层目录,sort -h按人类可读大小排序,tail看最大的几个。
进入最大的那个目录(比如 /var),继续下钻:
du -xhd1 /var 2>/dev/null | sort -h | tail
逐步 du -xhd1 <最大的目录>,一路追到具体文件/子目录。看到文件级后:
ls -lhS /var/log # 按大小列出该目录文件
提示:追到某层出现"许多小文件的总和巨大",那可能是 inode/海量小文件问题,见 inode 篇。
方法二:直接找超大单文件
# 全盘找 >1G 的文件(限制到根文件系统)
find / -xdev -type f -size +1G -exec ls -lh {} \; 2>/dev/null | sort -k5 -h
# 只找指定目录下超过 500M 的
find /var -type f -size +500M -exec ls -lh {} \; 2>/dev/null
配合把结果按大小排序:
find / -xdev -type f -size +100M -printf '%s %p\n' 2>/dev/null | sort -rn | head -20
方法三:ncdu 交互查看(最直观)
ncdu 提供可上下翻、按大小排的交互界面,是磁盘分析利器:
# Debian / Ubuntu
sudo apt install -y ncdu
# RHEL / CentOS / Rocky
sudo yum install -y ncdu
# 扫描根文件系统(不进其他挂载点)
sudo ncdu -x /
用方向键浏览、按目录展开,d 可直接删除,退出时按 q。只扫某个目录则 ncdu /var。
提示:
ncdu扫描较大分区会花些时间,但直观好用;日常命令行巡检用上面的du/find即可。
定位到之后的处理建议
- 超大日志:见《磁盘满了怎么办》用
truncate/轮转清理。 - 被删仍占用的文件:用
lsof +L1定位进程(见"删不掉"篇)。 - 缓存目录(
/var/cache、~/.cache):清理前确认用途。
长期:定期巡检 + 告警
手工排查只能救急,长期要监控磁盘增长:
# 简易巡检脚本思路:每天记录根分区用量到日志
df -h / | tee -a /var/log/disk-usage.log
生产环境建议纳入监控告警(阈值如 80% 提醒、90% 告警),并对已知会增长的目录(日志、数据库、上传目录)做好轮转与配额。
FAQ
问:最快找出磁盘大户的命令是什么?
du -xhd1 / | sort -h | tail 逐层找大目录;想找超大单文件用 find / -xdev -type f -size +1G。交互式用 ncdu -x /。
问:为什么 du 显示的和 df 差很多? 统计口径不同,见同系列《df 和 du 不一致》。
问:如何知道是哪个文件系统/分区满了?
df -h 会列出每个挂载点;先确认是根还是 /var、/home 等独立分区满,再去对应分区里定位。
问:有没有更省事的可视化工具?
ncdu 终端交互界面最省事;图形桌面可用 baobab/Filelight(仅本机 GUI 环境)。
完整的磁盘占用排查可串起同系列:df/du 不一致、磁盘满了删不掉、inode 耗尽、磁盘清理实战。