本期摘要du是 Linux 下分析磁盘占用最直接的命令与df互补df看分区整体du看具体目录/文件。掌握du -sh汇总目录大小、du -sh *列出子目录、du -h --max-depth1限制深度、du -sh --exclude排除目录等常用组合还能配合sort找出最大目录。本文还提供了并发执行du加速大目录扫描的小技巧以及处理 “文件名包含特殊字符” 的坑。du是什么du Disk Usage估算文件或目录的磁盘空间使用量。它会递归统计指定路径下所有文件的大小之和。典型场景找出/var下哪些子目录占用最大定位磁盘告警时的大文件或大目录清理空间前评估哪些可以删除最常用的5种姿势1. 查看当前目录总大小bashdu -sh .-s汇总summary-h人类可读。输出例如2.3G .2. 列出当前目录下各子目录大小bashdu -sh **会被 shell 展开成当前目录下所有文件和目录。如果文件很多可能会因为命令行参数长度限制而报错此时可以用bashdu -sh -- * # 或 find . -maxdepth 1 -type d -exec du -sh {} \;3. 指定深度bashdu -h --max-depth1 /var # 只看 /var 下第一级子目录 du -h --max-depth2 /home # 看两层4. 排除某些目录bashdu -sh --exclude./cache --exclude./logs5. 找到最大的几个目录bashdu -sh /home/* | sort -rh | head -10sort -rh表示按人类可读的数字降序排序需要sort版本支持否则用du -k以KB为单位再排序。进阶技巧以 KB/MB 为单位避免排序问题bashdu -k /home/* | sort -rn | head -10 # 以KB为单位适合脚本显示所有文件包括小文件的大小明细bashdu -ah /path # -a 显示文件而不是只显示目录跨文件系统du默认只统计同一文件系统内的文件。如果挂载了 NFS 或其他分区可以使用-x排除bashdu -shx / # 不跨越文件系统边界加速大目录扫描bash# 并行扫描使用 GNU parallel ls -d */ | parallel du -sh {}真实场景场景1/var 突然增长找出元凶bashdu -sh /var/* | sort -rh | head -10场景2docker 容器日志导致磁盘爆满bashdu -sh /var/lib/docker/containers/*/*.log | sort -rh场景3查找大于 100MB 的文件bashfind / -type f -size 100M -exec du -sh {} \; 2/dev/null场景4清理前检查要删的目录到底多大bashdu -sh /tmp/old_cachedu与df结果不一致的原因如果df看到分区已用空间很大但du统计各个目录加起来却很小可能的原因原因排查方法文件被删除但进程未释放句柄lsof | grep deleted文件被其他挂载点覆盖mount | grep on /var查看子挂载使用du -x排除其它文件系统确认统计范围常见坑点1. 文件名包含回车/特殊字符du默认输出会换行导致解析错误。解决bashdu -0 # 以 null 结尾配合 xargs -02. 符号链接导致的重复统计du默认会跟随符号链接不会它只统计链接本身大小很小。如果需要统计链接指向的文件使用-L。3. 权限问题du遇到无法读取的目录会报错可以忽略错误信息bashdu -sh /* 2/dev/null常用参数速查参数含义-s汇总只显示总额-h人类可读-a显示所有文件不只是目录--max-depthN目录深度 N--exclude排除模式-c显示总计多个参数时有用-k/-m以 KB / MB 为单位-x不跨越文件系统-L跟随符号链接下期预告《每日一命令16netstat——谁在偷偷连你的服务器》