Skip to content

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 demodir
text
4	demodir/sub2
8	demodir/sub1
1044	demodir

单位是 KB。sub2 是空的占 4K,sub1 占 8K,整个 demodir 占 1044K(约 1MB,主要是 big.bin)。

示例 2:人类可读 ​

bash
du -h demodir
text
4.0K	demodir/sub2
8.0K	demodir/sub1
1.1M	demodir

自动换成 K/M,不用心算。

示例 3:只看总大小(最高频组合) ​

bash
du -sh demodir
text
1.1M	demodir

-s 只给一个总数、-h 人类可读。排查"这个目录到底多大"就是这条。

示例 4:只看第一层子目录各占多少 ​

bash
du -h --max-depth=1 demodir
text
4.0K	demodir/sub2
8.0K	demodir/sub1
1.1M	demodir

这是下钻找大目录的核心用法:先 du -h --max-depth=1 /var,看哪个子目录最大,再 cd 进去重复同样命令,一层层定位。

示例 5:连单个文件一起列 ​

bash
du -ah demodir
text
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 避免跨文件系统。

七、新手易错点 ​

  1. du 和 df 对不上:df 看到盘满了,du 加起来却没那么大——通常是有进程占着已删除的大文件句柄(用 lsof | grep deleted 查),或有挂载点被覆盖。
  2. 在根目录直接 du -sh / 很慢:会遍历整个文件系统,建议先 --max-depth=1 下钻,或加 -x 只在本文件系统。
  3. -s 和 -d 别同时用:-s 就是 -d 0,再指定 -d 1 会冲突。
  4. 软链默认不跟随:统计软链指向的真实大小要加 -L,否则只统计链接本身(几十字节)。
  5. --apparent-size 与默认值不同:稀疏文件、碎片会导致"实际占用块"和"文件逻辑大小"不一样;一般排查磁盘用默认值。
  6. du 是只读命令:它只读取目录和文件大小,不会改动任何东西。

八、相关命令与文档 ​