主题
du 命令详解:找是哪个目录把磁盘塞满了
本文是 Linux 命令速查 中
du的从 0 到 1 详解。 目标:把du --help里的每个选项讲清楚,多看几遍后,你在服务器上敲du --help就知道该用哪个选项。 环境依据:GNU coreutils 8.32(Ubuntu 22.04 自带;RHEL/Rocky 自带版本用法一致)。
一、命令是干什么的
du(disk usage)用来统计一个目录(或文件)在磁盘上实际占用了多少空间。它会递归进入子目录,把每个目录的大小算出来。
排查流程是:先用 df -h 发现哪个分区满了 → 再用 du -sh 目录 一层层往下找,定位到底是哪个大文件/大目录吃掉了空间。
du 目录:递归列出该目录下每一层的大小;du -sh 目录:只给出该目录的总大小(summary,最常用);du -h --max-depth=1 目录:只看第一层子目录各占多少。
类比:
du就像 Windows 右键文件夹"属性"里的"大小",但它能递归地、按子目录分别汇报,方便你一层层下钻找"是谁占了这么多"。
关键区别:df 看整个分区剩多少;du 看某个目录占多少。两者回答的问题不一样。
二、命令语法
bash
du [选项]... [文件或目录]...[选项]:可选,控制是否只汇总、单位、下钻几层、排除哪些文件;[文件或目录]:可选,不写就统计当前目录;可以一次给多个。
最简单的用法:
bash
du -sh /var/log三、选项全表(对照 du --help)
1. 控制输出粒度
| 选项 | 中文含义 | 什么场景用 |
|---|---|---|
-s,--summarize | 只显示每个参数的总大小,不列子目录 | 看某个目录总共多大(最常用) |
-d N,--max-depth=N | 最多递归 N 层 | -d 1 看第一层各子目录 |
-a,--all | 每个文件(不只是目录)都列大小 | 想看单个文件占用时 |
2. 控制单位
| 选项 | 中文含义 | 什么场景用 |
|---|---|---|
-h,--human-readable | 人类可读(K/M/G) | 配合 -s/-d 用(极常用) |
-k | 以 1K 块为单位 | 脚本固定单位 |
-m | 以 1M 块为单位 | 快速看兆数 |
--si | 用 1000 进制 | 厂商口径 |
-B SIZE,--block-size=SIZE | 指定块大小 | 如 -BG |
3. 控制统计口径与过滤
| 选项 | 中文含义 | 什么场景用 |
|---|---|---|
-c,--total | 最后再输出一个合计 | 一次看多个目录的总和 |
--apparent-size | 看"表观大小"(文件本身字节数)而非实际占用块 | 看文件逻辑大小 |
-x,--one-file-system | 不跨越其他文件系统 | 避免统计到挂载进来的 NFS |
-L,--dereference | 跟随符号链接 | 想统计软链指向的内容 |
-S,--separate-dirs | 统计目录大小不含子目录 | 看"本目录自己"占多少 |
--exclude=PATTERN | 排除匹配的文件 | 如 --exclude="*.log" |
-X 文件,--exclude-from=文件 | 从文件读排除规则 | 批量排除 |
-t SIZE,--threshold=SIZE | 只显示大于/小于某大小的项 | -t +100M 只看超 100M 的 |
--inodes | 按 inode 用量统计 | 配合 df -i 排查小文件 |
四、由浅入深的典型示例
演示目录结构:demodir/ 下有 a.txt、big.bin(1MB)、sub1/b.txt、sub2/。
示例 1:递归列出每层目录大小(默认)
bash
du demodirtext
4 demodir/sub2
8 demodir/sub1
1044 demodir单位是 KB。
sub2是空的占 4K,sub1占 8K,整个demodir占 1044K(约 1MB,主要是 big.bin)。
示例 2:人类可读
bash
du -h demodirtext
4.0K demodir/sub2
8.0K demodir/sub1
1.1M demodir自动换成 K/M,不用心算。
示例 3:只看总大小(最高频组合)
bash
du -sh demodirtext
1.1M demodir
-s只给一个总数、-h人类可读。排查"这个目录到底多大"就是这条。
示例 4:只看第一层子目录各占多少
bash
du -h --max-depth=1 demodirtext
4.0K demodir/sub2
8.0K demodir/sub1
1.1M demodir这是下钻找大目录的核心用法:先
du -h --max-depth=1 /var,看哪个子目录最大,再cd进去重复同样命令,一层层定位。
示例 5:连单个文件一起列
bash
du -ah demodirtext
4.0K demodir/sub2
1.0M demodir/big.bin
4.0K demodir/sub1/b.txt
8.0K demodir/sub1
4.0K demodir/a.txt
1.1M demodir
-a让每个文件都出现,这样能直接看到big.bin是 1.0M 的元凶。
示例 6:只列出大于 100M 的项
bash
du -h --max-depth=1 -t +100M /var
-t +100M只显示超过 100M 的目录,在一大堆输出里快速筛出"大块头"。
示例 7:排除日志文件后统计
bash
du -sh --exclude="*.log" /var/log想算"去掉所有 .log 后还剩多少"时用。
示例 8:多个目录并加合计
bash
du -sch /var/log /var/lib /var/cache一次统计三个目录,
-c在最后给一个总合计行。
五、高频组合速记
| 命令 | 用途 |
|---|---|
du -sh 目录 | 看某目录总大小(最常用) |
du -h --max-depth=1 目录 | 看第一层各子目录大小(下钻) |
du -ah 目录 | 连文件一起列 |
du -h -d 1 -t +100M 目录 | 只筛出超 100M 的大块头 |
du -sh --exclude="*.log" 目录 | 排除后统计 |
du -sch 目录1 目录2 | 多个目录加合计 |
六、RHEL 系与 Debian 系差异
du 属于 GNU coreutils,两系用法完全一致。细微差别:
- 默认块大小两系都是 1024 字节;
- 软链接行为默认两系都不跟随(
-P),需要跟随才加-L; - 大文件系统上
du会比较慢,可加-x避免跨文件系统。
七、新手易错点
du和df对不上:df看到盘满了,du加起来却没那么大——通常是有进程占着已删除的大文件句柄(用lsof | grep deleted查),或有挂载点被覆盖。- 在根目录直接
du -sh /很慢:会遍历整个文件系统,建议先--max-depth=1下钻,或加-x只在本文件系统。 -s和-d别同时用:-s就是-d 0,再指定-d 1会冲突。- 软链默认不跟随:统计软链指向的真实大小要加
-L,否则只统计链接本身(几十字节)。 --apparent-size与默认值不同:稀疏文件、碎片会导致"实际占用块"和"文件逻辑大小"不一样;一般排查磁盘用默认值。du是只读命令:它只读取目录和文件大小,不会改动任何东西。
八、相关命令与文档
- 速查页:Linux 命令速查
- 看分区还剩多少:
df(详解见 df) - 按条件找大文件:
find(如find / -size +100M) - 看磁盘设备:
lsblk(详解见 lsblk-blkid) - 存储排查思路:见 Linux 存储专题