Linux下的du(disk usage)命令是用于估算文件和目录磁盘使用空间的实用工具,它通过递归遍历指定路径下的文件和子目录,计算其占用的磁盘块数量,并以用户可读的格式展示结果,该命令在系统管理、磁盘空间排查、日志分析等场景中广泛应用,掌握其用法对于高效管理Linux系统至关重要。

du命令的基本语法
du命令的基本语法结构为:du [选项] [文件或目录]
,若未指定文件或目录,默认会显示当前目录下所有子目录及文件的磁盘使用情况,结果以字节为单位输出,在终端输入du
并回车,系统会列出当前目录每个子目录的磁盘占用,但这样的输出通常包含大量冗余信息,实际使用时需结合选项进行过滤和格式化。
常用选项及功能说明
du命令的丰富选项使其能够灵活适应不同需求,以下是核心选项的详细解析:
选项 | 全称 | 功能描述 | 示例 |
---|---|---|---|
-h | human-readable | 以人类可读格式显示(如K、M、G) | du -h /var/log |
-a | --all | 显示所有文件(默认仅显示目录) | du -a |
-s | --summarize | 仅显示总计值,不显示子目录详情 | du -sh /home |
-c | --total | 显示总计行,汇总所有输入参数的总和 | du -ch dir1 dir2 |
-L | --dereference-args | 解析符号链接指向的文件大小 | du -L symlink_dir |
--max-depth=N | 限制递归深度为N层 | du --max-depth=1 /etc |
|
-x | --one-file-system | 跳过其他文件系统的目录 | du -x /mnt |
-B | --block-size=SIZE | 指定块大小(如KB、MB) | du -BMB 1024 /tmp |
--exclude=PATTERN | 排除匹配模式的文件 | du --exclude="*.log" |
|
-t | --threshold=SIZE | 仅显示超过指定大小的文件/目录 | du -t 10M |
高级用法与实际应用场景
-
磁盘空间排查
当发现磁盘空间不足时,可使用du -sh /*
快速扫描根目录下各主要分区的占用情况,定位异常目录,若/var
目录占用过高,可进一步用du -sh /var/* | sort -hr
按占用大小排序,快速找到大文件或日志目录。 -
日志文件管理
在运维中,常需清理过期日志,通过du -sh --exclude="*.gz" /var/log/nginx
可排除压缩日志,查看原始日志占用;结合find
命令可实现批量清理,如find /var/log -name "*.log" -mtime +30 -exec du -ch {} + | grep total
。(图片来源网络,侵删) -
限制递归深度
对于大型目录(如/usr
),全量扫描耗时较长,使用du --max-depth=2 /usr
可仅查看两级子目录的占用,快速定位大容量目录。 -
排除特定文件类型
在代码仓库中,可通过du -sh --exclude=".git" --exclude="node_modules" .
排除版本控制和依赖目录,获取项目实际代码大小。 -
跨文件系统扫描
当挂载多个磁盘时,du -x /data
可避免统计其他文件系统的目录(如/data/mnt/other_disk
),确保结果准确反映当前文件系统的占用。
输出格式与单位控制
默认情况下,du以字节为单位输出,难以直观理解,通过-h
选项可自动转换为KB、MB、GB等单位,如du -h dir
显示2G dir
,若需自定义单位,可使用--block-size
,例如du -BKB 1024 file
以1024字节块为单位显示,结合sort -hr
可实现按大小倒序排列,如du -sh /* | sort -hr
。

注意事项与常见陷阱
- 符号链接处理:默认情况下,du统计符号链接本身的大小(通常为4KB),若需统计其指向文件的实际大小,需加
-L
选项。 - 性能影响:对大目录(如
/proc
)递归扫描可能导致高I/O负载,建议结合--max-depth
限制范围。 - 块大小差异:不同文件系统的块大小(如4KB、8KB)会影响统计结果,
-B
选项可统一计算基准。 - 权限问题:若遇到
Permission denied
错误,可使用sudo du
或du --ignore-access-denied
(需GNU coreutils支持)。
相关问答FAQs
问题1:如何使用du命令查找大于100MB的文件?
解答:可通过find
命令结合du
实现,具体命令为:find /path -type f -exec du -h {} + | grep -E '^[0-9.]+[MG]' | sort -hr
。find
定位所有文件,du -h
以人类可读格式显示大小,grep
过滤出大于100MB的文件(M/G单位),sort -hr
按大小倒序排列。
问题2:为什么du显示的磁盘占用与df不一致?
解答:两者统计逻辑不同。du
从文件系统角度统计实际文件占用的数据块(包括间接块等),而df
从块设备角度统计已分配的块数(包含文件元数据、预留空间等),常见差异包括:du
不统计未使用的块,df
包含文件系统元数据开销;du
可能因进程正在写入文件导致统计延迟;du
默认跳过挂载点目录,而df
会统计整个挂载设备,可通过du -x --exclude=lost+found
与df -h
对比,减少差异影响。