Linux查找大目录命令,du --max
当服务器磁盘空间不足时,快速定位占用最大的目录是运维中的常见需求。du 命令配合 --max-depth 参数能帮你逐层查看目录大小,避免盲目翻找。
本文面向零基础用户,从命令格式到实战排错,手把手教你用 du --max-depth 揪出 Linux 系统中的大目录。
适用场景与前置准备
du(disk usage)用于统计目录或文件的磁盘占用量。--max-depth 控制统计深度:--max-depth=1 只显示当前目录下一级子目录的大小,--max-depth=0 等同于只显示当前目录总大小。
该命令适用于服务器磁盘告警、网站根目录膨胀、日志堆积等场景。
开始前,你需要一个 Linux 终端(SSH 或本地终端均可)和基本的目录读写权限。
建议先切换到目标目录,例如 cd /var/log,再执行统计。
核心用法:du --max-depth 命令详解
最常用的形式是 du -h --max-depth=1,其中 -h 表示以易读格式(如 K、M、G)显示大小。
执行后会列出当前目录下每个子目录的大小,最后一行是当前目录的总大小。
du -h --max-depth=1 /var/log
输出示例:
120M /var/log/nginx
80M /var/log/mysql
300M /var/log
若只想看总大小,用 --max-depth=0;
若要深入两层,用 --max-depth=2。深度值越大,扫描文件越多,耗时越长,建议从 1 开始逐层下钻。
分步操作:从磁盘告警到定位大目录
假设收到磁盘使用率超过 90% 的告警,按以下步骤操作:
- 查看整体磁盘占用:
df -h,确认哪个分区满了。 - 进入该分区根目录,例如
cd /。 - 统计一级目录大小:
du -h --max-depth=1 2>/dev/null | sort -hr。sort -hr按数值降序排列,2>/dev/null屏蔽权限报错。 - 找到最大的目录后进入,重复步骤 3,直到定位到具体文件。
- 对确认无用的大文件(如旧日志、缓存),用
rm清理或logrotate管理。
关键点:du 统计的是磁盘占用,与 ls -l 显示的文件大小可能不同(稀疏文件或块大小影响)。
避坑指南:常见报错与注意事项
- 权限不足报错:普通用户执行
du遇到Permission denied,可加sudo或重定向错误输出2>/dev/null。 - 统计结果偏慢:目录内文件极多时,
du会遍历所有 inode。可先限制深度,或使用--exclude排除已知小目录。 - 硬链接重复计算:
du默认会重复计算硬链接,若需去重可加-l参数(部分系统支持)。 - 不要直接删除正在写入的日志:用
> filename清空而非rm,避免文件句柄未释放导致空间不回收。 --max-depth与-d等价:短选项-d 1更简洁,效果相同。
效果验证与结果确认
执行清理后,重新运行 df -h 查看分区使用率是否下降。
再用 du -sh /path/to/dir 确认目标目录大小变化。
若空间未释放,检查是否有进程仍占用已删除文件:lsof | grep deleted,重启对应服务即可。
可独立摘录的结论:
du --max-depth=1是定位一级大目录最快的方法,配合sort -hr能直接看到排名。- 扫描深度越大耗时越长,生产环境建议从深度 1 开始逐层缩小范围。
- 清理日志文件时,优先使用
> filename清空,而不是直接删除。
常见疑问
du 和 df 结果为什么不一致?
df 统计文件系统层面的已用块,du 统计文件占用的块。若文件被删除但进程仍持有句柄,df 会显示占用而 du 不会。
如何只查看大于 1G 的目录?
结合 du 和 awk:du -h --max-depth=1 | awk '$1 ~ /G/',但注意单位换算不精确,更推荐 du -b --max-depth=1 | awk '$1 > 1073741824'。
du 命令卡住怎么办?
可能是遍历了挂载的网络文件系统或海量小文件。用 timeout 30 du -h --max-depth=1 限制执行时间,或通过 -x 参数限制在同一文件系统内。
掌握 du --max-depth 用法后,你可以快速应对大多数磁盘空间问题。
建议在测试环境先练习,再应用到生产服务器。