du (disk usage) 命令用于估算文件和目录的磁盘空间使用量,是 Linux 系统管理和日常运维工作中不可或缺的工具。
基本语法:
du [选项]... [文件]...
直接使用:
如果直接无参数使用 du 命令,会显示当前目录及其所有子目录的磁盘空间使用情况。默认以 1024 字节块为单位,并且只显示目录的总大小,不单独列出文件。
# 当前目录下的文件与子目录
$ ls
file1.txt file2.txt file3.txt file4.txt t.py vim
$ du
8 ./vim
12 .
指定目标:
你也可以指定具体的文件或目录路径,du 会计算并显示其大小,支持同时指定多个目标。
du ./vim
du file1.txt ./vim
一、核心选项详解
1. 显示所有文件 (-a / --all)
默认情况下,du 只显示目录的汇总大小。使用 -a 选项可以显示目录中每一个文件的大小。
$ du -a
4 ./vim/xx.py
8 ./vim
0 ./file3.txt
0 ./t.py
0 ./file1.txt
0 ./file2.txt
0 ./file4.txt
12 .
2. 人性化显示大小 (-h / --human-readable)
使用 -h 选项,du 会以 K、M、G、T 等易读的单位显示大小(以 1024 为基数)。
$ du -h
8.0K ./vim
12K .
而 --si 选项则使用 SI 单位制(以 1000 为基数),例如 1M=1,000,000 字节。
$ du --si
8.2k ./vim
13k .
3. 汇总与总计 (-c / -s)
组合使用示例:
查看多个目录各自的汇总大小(人性化显示):
$ du -sh /home /var /tmp
20K /home
43M /var
3.4M /tmp
查看当前目录下所有项目的各自大小:
$ du -sh *
0 file1.txt
0 file2.txt
0 file3.txt
0 file4.txt
0 t.py
8.0K vim
4. 指定显示单位 (-k, -m, -B)
-k: 以 KB (1024字节) 为单位显示,等同于 --block-size=1K。
-m: 以 MB (1,048,576字节) 为单位显示,等同于 --block-size=1M。
-B SIZE / --block-size=SIZE: 指定自定义单位,支持 K, M, G, T, P, E, Z, Y。
$ du -m
1 ./vim
1 .
5. 显示字节与表观大小 (-b, --apparent-size)
-b / --bytes: 直接以字节为单位显示大小。
--apparent-size: 显示文件的“表观大小”(即文件内容实际的数据量),而不是它在磁盘上占用的块空间。这对于处理稀疏文件(sparse file)尤为重要。
稀疏文件示例:
# 创建一个1G大小的稀疏文件(实际磁盘占用可能为0)
$ dd if=/dev/zero of=sparse_file bs=1 count=0 seek=1G
# 显示实际磁盘占用(很小)
$ du -h sparse_file
0 sparse_file
# 显示表观大小(1G)
$ du -h --apparent-size sparse_file
1.0G sparse_file
6. 控制目录递归深度 (-d / --max-depth)
限制 du 命令递归的目录深度。
-d 0 / --max-depth=0: 等价于 -s,只显示总计。
-d 1 / --max-depth=1: 显示当前目录的直接子目录。
# 只显示/home下第一级子目录的大小
$ du -h --max-depth=1 /home
16K /home/ubuntu
20K /home
7. 处理符号链接 (-L, -H, -P)
-L / --dereference: 跟踪并显示符号链接所指向的实际目标的大小。
-H / --dereference-args: 仅跟踪命令行参数中指定的符号链接。
-P / --no-dereference: 不跟踪符号链接(默认行为),显示链接文件本身的大小。
8. 硬链接处理 (-l / --count-links)
默认情况下,du 对多个硬链接指向的同一文件数据只计算一次。使用 -l 选项会计算所有硬链接,可能导致统计结果偏大。
9. 单独目录统计 (-S / --separate-dirs)
报告目录大小时,不包括其子目录的大小,只计算目录本身及其直接包含的文件。
# 不使用 -S:/home 的大小包含了子目录 /home/ubuntu
$ du -h /home
16K /home/ubuntu
20K /home
# 使用 -S:/home 的大小只计算其直接包含的文件
$ du -h -S /home
16K /home/ubuntu
4.0K /home
10. 排除文件 (--exclude, -X)
--exclude=PATTERN: 排除匹配指定模式的文件或目录,支持通配符。
-X FILE / --exclude-from=FILE: 从指定文件中读取要排除的模式列表(每行一个)。
# 排除所有.o文件和.git目录
du -h --exclude='*.o' --exclude='.git' project/
11. 不跨越文件系统 (-x / --one-file-system)
只在当前文件系统中递归计算,不统计挂载在其他设备上的目录。
12. 按大小阈值过滤 (-t / --threshold)
只显示大小大于等于指定阈值的条目。若阈值为负数,则显示大小小于等于其绝对值的条目。
# 查找大于100MB的目录
du -h --threshold=100MB
# 查找小于1MB的文件和目录
du -a -h -t -1MB
13. 显示时间戳 (--time)
显示文件或目录的最近修改时间(mtime)。可以通过 --time=atime 或 --time=ctime 显示访问时间或状态更改时间。使用 --time-style 控制时间格式。
$ du -h --time
8.0K 2026-01-15 10:50 ./vim
12K 2026-01-15 11:08 .
14. 从文件读取目标 (--files0-from)
从指定文件中读取要处理的文件名列表(以 NULL 字符分隔),适用于处理大量文件或文件名包含特殊字符的情况。
$ find /home -type f -print0 > files.txt
$ du --files0-from=files.txt
15. 以 NULL 字符结尾输出 (-0 / --null)
输出的每行以 NULL 字符结尾,而非换行符,便于 xargs -0 等命令处理。
16. 显示 inode 使用情况 (--inodes)
显示 inode 的使用数量,而非磁盘空间占用。可用于快速定位哪个目录包含了海量小文件,这在某些文件系统和场景下对性能影响显著。
$ du --inodes -h /home
$ du --inodes -a -h /home
1 /home/ubuntu/.profile
1 /home/ubuntu/.bashrc
1 /home/ubuntu/.bash_logout
4 /home/ubuntu
5 /home
二、实用场景与命令组合
掌握了核心选项后,我们可以组合使用 du 命令来解决实际问题。
1. 定位占用空间最大的目录或文件
这是 du 最经典的用途。结合 sort 和 head 命令,可以快速找出“元凶”。
# 查找当前目录下最大的10个目录
du -h --max-depth=1 | sort -hr | head -10
# 递归查找所有大于100MB的文件
du -a -h -t 100MB | sort -hr
2. 按用户统计磁盘使用量
在多用户环境中,快速查看各用户主目录的占用情况。
# 统计/home下各用户目录大小
du -sh /home/*
# 并计算总计
du -sch /home/* | tail -1
3. 监控日志目录增长
系统运维中,日志目录常是磁盘空间告警的源头。
# 查看/var/log总大小
du -sh /var/log
# 查看其下各子目录/日志文件大小
du -h --max-depth=1 /var/log
4. 备份前预估数据量
在实施备份前,先估算需要备份的数据总量。
du -sch /etc /home /opt/important_data
5. 与 find 命令强强联合
find 负责筛选,du 负责统计,这是非常强大的组合。
# 查找并统计30天前修改的、大于10MB的文件
find /var/log -type f -mtime +30 -exec du -h {} + 2>/dev/null
# 查找并汇总当前目录下所有.jpg图片的总大小
find . -name "*.jpg" -exec du -ch {} + | tail -1
6. 其他实用技巧
# 使用 watch 命令动态监控/tmp目录大小变化(每5秒刷新)
watch -n 5 "du -sh /tmp"
# 生成详细的磁盘使用报告文件
du -ah /home | sort -rh > disk_usage_report.txt
# 排除多种类型的临时或缓存文件进行统计
du -h --exclude='*.log' --exclude='*.tmp' --exclude='cache' /var
最后需要明确的是,du 命令主要用于估算文件和目录集合的大小(例如备份前),其统计基于文件系统块。当需要精确了解磁盘设备整体的已用/可用空间时,应使用 df 命令。du 和 df 结合使用,才能对系统的存储状态有全面的了解。
希望这篇详细的指南能帮助你更高效地使用 du 命令管理磁盘空间。更多Linux系统管理和运维技巧,欢迎在技术社区交流探讨。