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 耗尽、磁盘清理实战。