du(disk usage)是Linux/Unix系统中用于估算文件和目录磁盘空间使用量的标准工具。与df(查看文件系统整体使用情况)不同,du从目录和文件级别报告空间占用,帮助管理员快速定位哪些目录或文件占用了大量磁盘空间。
du命令支持多种输出格式,可以控制遍历深度、排除特定文件、排序输出等,是磁盘空间分析和清理的核心工具。掌握du对于日常系统维护、日志清理、容量规划等场景至关重要。
1. 基本用法
| 命令 | 说明 |
|---|
du | |
du file.txt | |
du dir1 dir2 | |
du -h directory/ | |
du -sh directory/ | |
du -sh * | |
sudo du -sh /var | |
2. 大小显示格式
| 选项 | 说明 |
|---|
-h | |
-H | |
-k | |
-m | |
-B G | |
-B SIZE | |
-b | 等效于--apparent-size --block-size=1(精确字节数) |
3. 汇总与总计
| 命令 | 说明 |
|---|
du -s directory/ | |
du -sh directory/ | |
du -c dir1 dir2 | |
du -csh /var/log /var/lib | |
du -a directory/ | |
du -sh --apparent-size directory/ | |
4. 深度控制
限制du向下递归的层级深度:
| 命令 | 说明 |
|---|
du -h --max-depth=1 directory/ | |
du -h --max-depth=2 directory/ | |
du -h -d 1 directory/ | -d |
du -h --max-depth=0 directory/ | |
du -h --max-depth=1 / | sort -rh | |
5. 排除文件
| 选项 | 说明 |
|---|
--exclude=PATTERN | |
--exclude-from=FILE | |
-x | |
--exclude=*.log | |
--exclude=node_modules | |
示例:
du -sh --exclude="*.log" /var # 排除.log文件
du -sh --exclude=node_modules ~/project # 跳过node_modules目录
du -xsh / # 仅统计根文件系统(忽略其他挂载点)
du -sh --exclude-from=exclude.txt /data # 从文件读取排除列表
6. 排序与Top N
结合sort和head查找最大项目:
| 命令 | 说明 |
|---|
du -h directory/ | sort -rh | |
du -h directory/ | sort -rh | head -10 | |
du -h --max-depth=1 / | sort -rh | head -20 | |
du -ah directory/ | sort -rh | head -10 | |
du -sh */ | sort -rh | |
du -h --max-depth=1 | sort -rh | head -5 | |
7. 实用组合模式
| 命令 | 说明 |
|---|
du -ah /var/log | sort -rh | head -20 | |
du -sh /home/* | sort -rh | head -10 | |
find / -type f -size +100M -exec du -sh {} \; 2>/dev/null | |
du -sch /var/lib/docker /var/log /home | tail -1 | |
du -h --max-depth=1 /var | grep -v "/var$" | sort -rh | |
du -h --time /var/log | |
du -0 /var/log | xargs -0 -n1 echo | |
8. 常用选项
| 选项 | 完整名称 | 说明 |
|---|
-a | | |
-s | | |
-c | | |
-h | | |
-H | | |
-k | | |
-m | | |
-b | | |
-d N | | |
-x | | |
-L | | |
-P | | |
-l | | |
--exclude | | |
--exclude-from | | |
--apparent-size | | |
--time | | |
-0 | | |
-S | | |
9. du vs df 对比
典型工作流:
# 1. 先用df查看哪个分区满了
df -h
# 2. 再用du定位具体大目录
sudo du -sh /* | sort -rh | head -10
sudo du -sh /var/* | sort -rh | head -10
10. 故障排查
| 问题 | 解决方法 |
|---|
| du显示空间与df不一致 | df包括被删除但仍在运行的进程占用的空间;使用`lsof |
| 目录显示总大小为4.0K | 目录本身占用很少空间;使用-a查看文件大小;使用--apparent-size |
| du扫描很慢 | 使用--max-depth限制深度;使用-x排除其他文件系统;排除缓存目录 |
| 权限不足 | 使用sudo执行;跳过无权限目录:2>/dev/null |
| 输出结果难以解析 | 使用-b获得精确字节数;使用--time获取时间信息 |
| 符号链接导致重复计数 | |
| 硬链接文件重复计数 | 默认每个链接单独计数;使用-l会多次计数;默认行为通常符合预期 |
温馨提示: du是磁盘空间分析的首选工具。建议掌握以下技巧:1)先用df -h找出满的分区,再用du定位具体目录;2)du -sh * | sort -rh是快速查看当前目录大项目的常用组合;3)使用--max-depth=1控制输出层级,避免输出过多;4)排除/proc、/sys等虚拟文件系统;5)脚本中使用-b获得精确字节数便于计算;6)清理大文件前,先用file命令确认文件类型。对于需要定期运行的分析,可以结合watch命令:watch -n 60 'du -sh /var/log'。