正确命令是 du -ah . | sort -rh | head -n 20:-a 列出所有文件(含大文件),-h 保证人类可读单位正确解析,-r 实现降序排列,确保最大20项排在最前。

用 du + sort + head 快速列出占用最大的前20项
直接执行这一条命令就能拿到当前目录下磁盘占用 Top 20 的文件和子目录:
du -ah . | sort -rh | head -n 20
注意三点:
-
du -ah中的-a表示“列出所有文件”,不加它默认只统计目录,会漏掉大文件本身 -
sort -rh的-r是倒序(最大在前),-h才能正确解析1.2G、45M这类人类可读单位;没加-h会导致排序错乱(比如900K排在10M前面) - 如果目标不是当前目录,把
.换成具体路径,例如/var/log,但要注意权限——普通用户可能无法遍历系统目录,此时会看到大量Permission denied报错,不影响结果,但输出杂乱;建议加2>/dev/null屏蔽错误
查指定挂载点(如 /home)下的 Top 20,别误进 /proc 或 /sys
运行 du 时若不加限制,会递归进入虚拟文件系统(/proc、/sys、/dev),导致卡住或报错。安全做法是先确认目标挂载点,再排除干扰路径:
du -sh /home/* 2>/dev/null | sort -rh | head -n 20
关键点:
-
du -sh对每个一级子项单独统计,避免深度遍历带来的延迟和权限问题 -
/home/*不含隐藏项(如.cache),如需包含,改用/home/.[^.]* /home/*,但注意.和..会被 shell 展开,实际应写为/home/.[^.]* /home/*并加引号或用find - 真正想查整个挂载点(比如
/data)又怕踩坑,用find /data -xdev -type f -print0 | xargs -0 du -sh | sort -rh | head -n 20,其中-xdev确保不跨文件系统,避开/proc类伪文件系统
为什么 df -h 显示已满,但 du 加起来远小于它?
这是常见幻觉,根本原因通常是:已被删除但进程仍在写入的文件(deleted 状态)。这类文件占着空间却不显示在目录树里,du 找不到,df 却会计入。
验证方式:
- 运行
lsof +L1(需要 root 权限),它会列出所有被删除但仍被打开的文件 - 或更常用:
lsof | grep deleted,输出类似rsyslogd 1234 root 1w REG 8,1 123456789 0t0 /var/log/syslog (deleted) - 解决办法不是删进程,而是重启对应服务(如
systemctl restart rsyslog),或用echo > /proc/1234/fd/1清空其 stdout/stderr 占用(仅适用于日志类场景)
想交互式浏览?装 ncdu 比拼命令更稳
命令行拼接容易出错,尤其路径深、权限杂时。ncdu 是专为此设计的交互式工具,安装后一行启动:
ncdu /path/to/dir
优势明显:
- 自动跳过无权限目录,不报错不中断
- 按
↑↓导航,→进入子目录,d删除选中项(带确认),q退出 - 顶部实时显示当前路径总大小,底部显示已扫描进度和总计
- 安装极简:
apt install ncdu(Debian/Ubuntu)或yum install ncdu(CentOS/RHEL)
真正棘手的是那些不显示在 du 结果里、却真实吃掉空间的 deleted 文件,以及容器或 overlayfs 场景下的隐藏层——这些靠 Top 20 列表发现不了,得靠 lsof +L1 或 docker system df 这类专用诊断手段。











