深入解析 Linux du 命令:磁盘空间管理的核心利器
在 Linux 系统管理与运维中,精准掌握磁盘空间消耗是必备技能。du(Disk Usage)命令正是为此而生的核心工具,其功能远不止于简单的空间统计,理解其原理、精通其参数,能极大提升问题诊断与资源管理效率。

du 命令的核心机制与基础应用
du 命令通过递归遍历指定目录树中的每个文件和子目录,累加其占用的磁盘块(disk blocks)数量来工作,这与基于文件系统元数据的 df 命令有本质区别:
du:计算文件或目录内容实际占用的物理磁盘空间(块数 * 块大小)。df:报告整个文件系统的已用/可用空间(基于超级块信息)。
常用基础参数解析:
-h / --human-readable:以人性化单位显示(K, M, G),强烈推荐始终使用。-s / --summarize:仅显示指定目录的总计,不递归列出子目录。-c / --total:在输出最后显示所有参数的总计。--max-depth=N:限制递归深度(--max-depth=0等效于-s)。-a / --all:显示所有文件的统计,默认只显示目录。
基础示例:
# 查看当前目录总大小 (常用组合 -sh) du -sh ./ # 查看 /var/log 及其一级子目录大小 du -h --max-depth=1 /var/log # 查看多个目录大小并显示总计 du -sch /home /var /opt
高级参数:解决复杂场景的利器
-
--apparent-size:- 报告文件的逻辑大小(
ls -l显示的大小),而非磁盘占用。 - 核心价值:识别稀疏文件或由块大小开销引起的差异,大量小文件的实际磁盘占用会远大于其逻辑大小之和。
- 报告文件的逻辑大小(
-
-b / --bytes,-k,-m,-B SIZE:- 强制以指定单位(字节、KB、MB)或自定义块大小(
-B 1M)输出,禁用-h。 - 场景:需要精确字节数或脚本处理时。
- 强制以指定单位(字节、KB、MB)或自定义块大小(
-
--time/--time=ctime/atime/mtime:
- 显示文件或目录的指定时间戳(修改时间 mtime 是默认)。
- 场景:结合大小分析空间增长的时间规律。
-
--exclude=PATTERN/--exclude-from=FILE:- 排除匹配模式或文件中列出的模式的文件/目录。
- 场景:忽略特定缓存目录(如
--exclude='*.cache')或构建产物。
-
--threshold=SIZE(较新版本支持):- 仅显示大于等于指定大小的条目。
- 场景:快速定位大文件/目录 (
du -h --threshold=100M)。
du 实战场景与经验案例解析
场景 1:快速定位磁盘空间大户
# 找出 / 下最大的 10 个目录 du -h --max-depth=1 / | sort -rh | head -n 11 # 包含 / 自身 # 或 (推荐,避免权限问题) sudo du -h --max-depth=1 / 2>/dev/null | sort -rh | head -n 11
场景 2:精确统计特定类型文件的空间占用
# 统计当前目录及子目录中所有 `.log` 文件的总大小 find . -type f -name "*.log" -print0 | du -hc --files0-from=-
📌 独家经验案例 1:du 与 df 差异的深度排查
某次生产环境报警 分区 df 显示使用率 95%,但 du -sh / 统计仅为 60%,经验排查:
lsof | grep deleted:发现大量被进程持有但已删除的大日志文件。- 重启相关进程后空间释放。
du统计不到已删除的文件句柄,而df反映的是文件系统层面的块占用。
📌 独家经验案例 2:--apparent-size 揭示存储优化空间
在管理海量小图片的对象存储前置节点时,du -sh 显示占用 800GB,du -sh --apparent-size 显示仅 600GB,差异源于:

- 文件系统块大小(4K)导致小文件(如 1K)实际占用 4K。
- 据此推动业务将小文件合并存储或使用更适合的文件系统(如 XFS 对小文件更友好),显著提升存储利用率。
场景 3:按时间分析空间增长
# 查看 /data 下最近 7 天被修改过且大于 100M 的文件/目录
find /data -type f -mtime -7 -size +100M -exec du -h {} + | sort -rh
常见 du 场景参数速查表
| 任务目标 | 推荐命令组合 | 关键点说明 |
|---|---|---|
| 目录总计大小 | du -sh [目录] |
最常用组合 |
| 查看目录树各层级大小 | du -h --max-depth=N [目录] |
N=1 看直系子目录 |
| 排除特定文件/目录 | du -h --exclude='模式' [目录] |
支持通配符 |
| 找出指定目录下最大项 (Top N) | du -h --max-depth=1 [目录] \| sort -rh \| head -n K |
注意权限 (sudo), 处理错误输出 (2>/dev/null) |
| 统计特定文件类型总大小 | find [目录] -type f -name "*.ext" -print0 \| du -hc --files0-from=- |
精确统计, 处理含空格文件名 |
| 对比逻辑大小 vs 磁盘占用 | du -sh [文件/目录] 和 du -sh --apparent-size [文件/目录] |
识别稀疏文件/小文件开销 |
| 仅显示超过阈值的大文件/目录 | du -h --threshold=SIZE [目录] |
快速聚焦问题点 (需较新 du 版本) |
深入理解:du 统计的本质与注意事项
- 硬链接处理:
du默认会对每个硬链接单独计数,使用-l/--count-links可以避免重复计算(统计文件时只算一次),但慎用,可能导致目录总计小于子项之和。 - 挂载点边界:
du默认会遍历挂载点内的文件系统,使用-x/--one-file-system可限制在当前文件系统内统计,避免统计到如/proc,/sys或 NFS 挂载点。 - 权限影响:对无权限访问的目录/文件,
du会报错 (Permission denied) 且不统计其大小,使用sudo或处理错误输出 (2>/dev/null) 需权衡信息完整性与安全性。 - 元数据开销:
du统计的是数据块占用,目录本身、inode 表、日志等文件系统元数据的空间开销体现在df中,不包含在du对文件/目录的统计里。
权威文献参考
- 《Linux命令行与Shell脚本编程大全(第4版)》, Richard Blum, Christine Bresnahan 著, 人民邮电出版社,本书对 Linux 常用命令(包括
du)有系统、全面的讲解和示例。 - 《UNIX环境高级编程(第3版)》, W. Richard Stevens, Stephen A. Rago 著, 人民邮电出版社,经典著作,深入剖析 UNIX/Linux 系统机制,理解文件系统、磁盘 I/O 等底层原理对掌握
du行为至关重要。 - 《鸟哥的Linux私房菜:基础学习篇(第四版)》, 鸟哥 著, 人民邮电出版社,国内经典教材,对 Linux 命令的使用场景和常见问题有贴近实战的中文讲解。
- 《Linux系统管理技术手册(第5版)》, Evi Nemeth, Garth Snyder, Trent R. Hein, Ben Whaley 著, 电子工业出版社,系统管理员必备参考,包含磁盘管理和相关命令 (
du,df,find等) 的深入实践指南。
深度问答 FAQs
Q1:为什么 du -sh / 的结果和 df -h / 显示的已用空间经常不一致?哪个更准确?
A:两者机制不同:du 统计文件数据块总和,df 报告文件系统块分配状态,差异主要源于:1) 已删除但被进程占用的文件 (df 计入,du 不计);2) 文件系统预留空间/元数据 (df 计入,du 不计);3) 稀疏文件 (du 按实际块计,df 按逻辑大小预分配?不准确,稀疏文件分配按实际块)。df 显示的已用空间是文件系统层面的“真相”,直接关系磁盘是否写满。du 用于分析的空间分布,当磁盘快满但 du 找不到大文件时,检查 lsof | grep deleted 和 df -i (inode 是否耗尽)。
Q2:如何最准确地统计一个包含海量文件(百万级)的目录总大小?使用 du -sh 很慢怎么办?
A:du -sh 慢在递归遍历和统计每个文件,优化方案:
--time配合mtime筛选:如果知道文件大致修改时间范围,先用find过滤再统计。- 利用文件系统特性:如 ZFS/Btrfs 支持快照对比或内置空间报告命令 (
zfs list/btrfs filesystem usage)。 ncdu工具:基于du的 NCurses 交互式工具,首次扫描慢,但可缓存结果供后续分析。- 终极方案 文件系统快照:对目录创建快照,然后在快照上运行
du,避免扫描影响生产性能。最重要是结合--max-depth先定位问题子目录,避免全量扫描。


















