<p>du -sh * | sort -rh 是最常用且轻量的定位方式,用于快速列出当前目录下各子项大小,响应快、单位可读、排序准确,但默认不匹配隐藏文件,权限错误需静默处理。</p>

du -sh * | sort -rh 直接列出当前目录下各子项大小
这是最常用也最轻量的定位方式,适合快速扫一眼当前目录里哪些子目录或文件吃掉了最多空间。关键在于 du -sh * 中的 * —— 它只展开当前层级,不递归进子目录,所以响应极快。
-
-s让du只输出每个项目的汇总大小,避免逐层打印干扰视线 -
-h保证单位可读(如1.2G、456M),sort -rh才能正确按人类习惯排序 - 如果当前目录含大量隐藏文件(如
.git、.cache),*默认不匹配它们,结果会漏掉;此时改用du -sh .[^.]* *或直接上du -sh ./* - 遇到权限不足报错(比如某些
/var/log/journal子目录),加2>/dev/null静默忽略,但要留意是否因此掩盖了真正的大目录
du -ah . | sort -rh | head -n 20 查全树最大20个条目
当怀疑大文件藏在深层子目录里,就得递归统计。但 du -ah 会把每个普通文件都列出来,结果中目录和文件混杂,容易误判——比如一个 1.8G 的 archive.tar.gz 和一个 1.7G 的 logs/ 目录并列,你得自己分辨哪个更值得清理。
-
-a是关键:没有它,du默认跳过文件、只统计目录,你会漏掉单个大文件 - 输出里每行形如
1.2G ./data/db.sqlite3,sort -rh能正确解析这种带单位的数值,但依赖 locale 设置;若终端 locale 不是C或en_US.UTF-8,可能排序错乱,临时加LC_ALL=C更稳妥 -
head -n 20后建议再补一句| tail -n +1避免某些 shell 对管道首行处理异常,虽小概率但真发生时会少显示第一行 - 扫描根目录
/时务必加-x(即du -ahx /),否则碰到挂载点(如/proc、/sys)会卡住或报错
ncdu /path --exclude /proc --exclude /sys 交互式钻取更可靠
命令行组合虽快,但面对嵌套深、结构杂的目录(比如 /var/lib/docker 或用户家目录),靠肉眼扫几十行 du 输出效率低且易遗漏。这时候 ncdu 的实时导航优势明显——它边扫描边显示,支持键盘跳转,还能动态切换视图。
- 安装后首次运行
ncdu /前,必须加--exclude过滤虚拟文件系统,否则会在/proc上卡死,甚至触发 OOM killer - 进入某个目录后按
s键可按大小重排序,但注意:默认排序的是“该目录下所有子项的磁盘占用”,不是“子项自身大小”;想看纯文件大小,得先cd进去再按s - 按
i键可查看高亮条目的详细信息,包括实际大小(on-disk size)和逻辑大小(apparent size),对稀疏文件或硬链接特别有用 - 导出扫描结果用
ncdu -o report.dat /path,之后用ncdu -f report.dat复查,避免重复扫描耗时
find -type f -size +100M -exec ls -lh {} \; | sort -rh -k5 定向抓大文件
如果你明确只想找“单个大文件”(比如日志、镜像、备份包),而不是目录总和,du 就有点绕——它统计的是目录占用,包含元数据、碎片等。而 find -size 直接按文件系统属性筛选,更精准,也更快。
-
+100M表示“大于 100MB”,单位支持k、M、G;注意find的M是 1024×1024 字节,和du -h一致 -
-exec ls -lh {} \;比-ls更可控,因为后者输出格式固定且不易提取字段;sort -rh -k5明确按ls -lh输出的第 5 列(大小)排序 - 路径中含空格或特殊字符时,
-exec ... {} \;比xargs更安全;若追求极致性能,可用-exec ... {} +批量调用,但需确保ls支持多参数 - 别忘了排除
/proc、/sys等,否则find会报Permission denied并中断,加-path /proc -prune -o -path /sys -prune -o前置过滤
真正麻烦的从来不是命令记不住,而是看到 12G ./cache 时,不确定这 12G 是缓存可删,还是某个服务的运行时数据。所以每次定位后,进目录用 ls -lSh 再扫一眼文件时间戳和类型,比单纯看大小更能决定下一步动作。


















