du 命令(全称 Disk Usage)是Linux系统中用于统计指定目录或文件占用磁盘空间容量的核心工具。在磁盘清理、日志文件排查或系统性能优化等场景中,通过快速扫描并量化文件系统的空间使用情况,帮助用户高效定位磁盘资源瓶颈或异常占用。
一、基本语法和参数
du 的语法看似简单,但参数组合决定了输出的可读性:
核心参数:
-h:人性化显示(Human-readable),这是最常用的参数,会自动将大小转换为 KB、MB、GB 等易读单位。
-s:汇总统计(Summarize),仅显示总大小,不列出子目录详情。
-a:显示所有(All),不仅显示目录大小,也显示目录内的每个文件大小。
-d N 或 --max-depth=N:限制目录层级深度。例如 -d 1 仅显示当前目录下一级子目录的大小,避免输出过长。
-c:计算总计,通常在最后增加一行统计总和。
--exclude:排除特定文件,例如排除日志文件统计。
提示:du 统计的是文件实际占用的磁盘块大小,而 ls 显示的是文件声明的逻辑大小,两者可能不一致。
二、输出详解
执行 du 命令时,通常会有多行输出,每一层级都会显示其占用的空间:
示例解析:若执行命令:
输出:
4.0K /home/log/nginx.log 8.0K /home/log/mysql.log 12K /home/log 12K /home
提示:在未加-s参数情况下递归显示深层文件,输出结果按层级递归显示。最内层目录先显示,最后显示根目录 /home 的总大小。
三、实用案例
1. 查看当前目录总大小(不含子项明细)
描述:-s 汇总(避免递归显示深层文件),-h 人性化单位(KB/MB/GB),直接输出目录大小(如 2.6G)。
2. 查看当前目录所有子目录及文件大小(最常用排查技巧)
描述:-s 汇总(避免递归显示深层文件),-h 人性化单位(KB/MB/GB),* 通配符匹配当前目录下所有非隐藏文件和目录。
3. 查找指定目录下最大的 5 个目录或文件
du -sh /home/* | sort -rh | head -5
描述:du -sh /home/*:列出 /home 下一级目录及文件的大小,sort -hr:按可读的数字逆序排序(最大的在最前),head -5:只看前 5 个。
4. 排除特定目录统计
du -sh --exclude="/var/log*" /var
描述: 统计 /var 时自动跳过所有 log 开头的目录,聚焦核心数据占用情况。
5. 统计特定类型文件
描述: 查看当前目录下所有 .log 文件的总大小,-c 参数会在最后加一行 “total”,直观显示所有 .log 文件的总占用。
四、常见问题
1. du 和 df 显示的磁盘使用率不一致?
原因: 通常是文件被删除了,但仍有进程在占用(打开)该文件,导致磁盘空间未真正释放。
解决: 使用 lsof | grep deleted 查找已删除但仍被占用的文件句柄,重启对应进程即可。
2. du 执行速度很慢?
原因:du 需遍历目录下所有文件的元数据,若目录层级极深或文件数量巨大(如百万级小文件),计算耗时较长。
解决: 使用 -d N 限制深度(如 -d 1),或分步排查,避免直接对根目录 / 执行无限制 du。
3. Permission denied 报错?
原因: 普通用户无法读取其他用户的私有目录(如 /root)。
解决: 在命令前加 sudo 提权执行。
五、扩展技巧
1. 与 df 命令联动排查
磁盘占用排查流程:先用 df -h 确认哪个分区满了,进入该分区根目录,用 du -sh * 逐层排查。
2. 只统计文件数量(非大小)
du -a /path/to/dir | wc -l
描述:du -a 列出所有文件,wc -l 统计行数,即文件总数。
总结
du 命令的核心价值在于对磁盘空间占用的精准量化与快速定位。当面临磁盘告警时,遵循科学排查流程是关键,避免盲目删除文件引发风险。建议按以下步骤系统应对:
1.先用 du -sh * 快速扫描当前目录,定位大文件;
2.结合 df 确认分区,层层递进排查;
3.必要时用 --exclude 过滤干扰项。