du (Disk Usage) 是 Linux 系统中用于统计文件或目录所占磁盘空间大小的命令。
与 df(查看分区/文件系统 的整体使用情况)不同,du 的核心作用是深入目录内部 ,帮你找出具体是哪个文件夹或文件占用了大量空间。
1. 基本语法
du [选项] [文件或目录]
- 如果不加参数,默认显示当前目录下所有子目录的大小(递归显示)。
- 如果指定了目录,则显示该目录及其子目录的大小。
- 如果指定了文件,则显示该文件的大小。
2. 常用选项 (Options) ------ 必记组合
| 选项 | 全称 | 说明 | 示例 |
|---|---|---|---|
-h |
--human-readable |
人类可读 。以 K, M, G, T 为单位 (最常用)。 | du -h |
-s |
--summarize |
仅显示总计。不列出每个子目录,只显示指定目标的总和。 | du -sh /var |
-a |
--all |
显示所有文件的大小,而不仅仅是目录。 | du -ah |
-c |
--total |
在最后增加一行总计 (Combined total)。 | du -ch |
-d N (或 --max-depth=N) |
--max-depth |
限制递归深度 。只统计到第 N 层子目录。排查大目录神器。 | du -h -d 1 |
--exclude |
排除特定的文件或目录 (支持通配符)。 | du -h --exclude="*.log" |
|
-x |
--one-file-system |
跳过其他文件系统。只统计当前所在分区,不跨越挂载点 (如 NFS, tmpfs)。 | du -xh |
-t |
--threshold |
只显示大于指定大小的条目。 | du -h -t 100M |
3. 实战场景与经典命令
场景 A:快速查看当前目录下各一级子目录的大小 (最常用)
这是运维排查"磁盘满了"时的第一步操作。
du -h -d 1
# 或者
du -h --max-depth=1
-
含义 :以人类可读格式,只显示当前目录下第一层子目录的大小,不深入显示更深层的细节。
-
输出示例 :text
14.0K ./bin 21.2G ./var 3500M ./home 42.0G .一眼看出
./var占了 1.2G,是主要嫌疑对象。
场景 B:查看特定目录的总大小
想知道 /var/log 整个文件夹占了多少空间,不想看里面的细节:
du -sh /var/log
-s: Summarize (总计)-h: Human-readable (人类可读)- 输出 :
1.2G /var/log
场景 C:找出当前目录下最大的前 10 个文件/目录
结合 sort 和 head 命令,直接定位"罪魁祸首"。
du -ah | sort -rh | head -n 10
du -ah: 列出所有文件和目录的大小。sort -rh: 按人类可读的数字大小进行反向排序 (Reverse, Human),即从大到小。head -n 10: 只取前 10 行。
场景 D:排除不需要统计的目录
比如你想统计项目代码大小,但不想算上巨大的 node_modules 或 .git 目录:
du -h -d 1 --exclude="node_modules" --exclude=".git"
- 支持多次使用
--exclude。 - 也可以使用通配符:
--exclude="*.log"。
场景 E:只统计当前分区 (防止遍历挂载的网络存储)
如果你在一个挂载了巨大网络存储 (NFS) 的目录下运行 du,可能会跑很久甚至卡死。加上 -x 可以限制只在当前物理分区统计:
1du -xh -d 1
场景 F:查找大于 500M 的大文件
du -ah -t 500M
-t 500M: Threshold (阈值),只显示大于 500MB 的条目。
4. du vs df (核心区别回顾)
很多新手会困惑:为什么 du 统计的总和 小于 df 显示的已用空间?
| 特性 | du (Disk Usage) |
df (Disk Free) |
|---|---|---|
| 统计对象 | 文件 (遍历目录树累加文件大小) | 文件系统块 (读取超级块元数据) |
| 速度 | 较慢 (需要遍历文件) | 极快 (直接读取元数据) |
| 差异原因 | 不统计 : 1. 已被删除但被进程占用的文件 ("幽灵文件") 2. 隐藏的系统保留空间 (reserved blocks) 3. 某些特殊文件系统开销 | 包含 : 1. 上述所有空间占用 |
| 典型用途 | "哪个文件夹占用了我的空间?" | "我的硬盘还剩多少空间?" |
💡 故障排查技巧 :
如果
df显示磁盘已满 (100%),但du -sh /*加起来只有 50%:
- 大概率是有文件被删除了,但进程(如 Java, Nginx, MySQL)还开着它。
- 执行
lsof | grep deleted查找这些文件。- 重启对应进程或清空文件内容 (
> /proc/PID/fd/FD) 释放空间。
5. 输出字段详解
执行 du -h 时:
14.0K ./config
21.5M ./logs/access.log
32.3G ./data
- 第一列:大小 (带单位)。
- 第二列:文件或目录路径。
- 注意:对于目录,显示的是该目录下所有内容的累计大小。
6. 总结与推荐命令
-
看当前目录谁最大 :bash
du -h -d 1 | sort -rh | head -n 10 -
看某个文件夹总大小 :bash
bashdu -sh /path/to/dir -
查找大于 1G 的所有文件 :bash
bashdu -ah -t 1G -
统计当前分区(忽略挂载点) :bash
1du -xh -d 1
du 是清理磁盘空间时不可或缺的工具,配合 sort 使用能极大提高效率。