1. 为什么你需要掌握du命令?
当服务器磁盘空间突然告急时,很多运维人员的第一反应往往是"哪个目录占用了这么多空间?"上周我就遇到一个典型案例:某台生产环境服务器突然触发磁盘报警,使用率飙升至95%。如果直接用ls -lh命令查看,根本找不到罪魁祸首——因为大文件可能藏在十几层子目录深处。这时候du命令就派上用场了,它能在3秒内帮你定位到真正的空间占用大户。
du(disk usage的缩写)是Linux系统自带的磁盘分析工具,相比简单的ls命令,它有三大不可替代的优势:
- 递归统计:能穿透任意深度的子目录结构
- 聚合计算:可以按目录层级汇总空间占用
- 智能格式化:支持人类可读的单位转换(KB/MB/GB)
实际工作中,我主要用du解决三类问题:
- 突发性磁盘空间告警时快速定位问题目录
- 定期清理前分析哪些目录值得重点处理
- 编写自动化监控脚本时获取精确的空间数据
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础用法:从入门到熟练
2.1 最常用的参数组合
新手建议从这两个黄金参数开始:
bash复制du -h --max-depth=1 /path/to/directory
这里的-h代表"human-readable",会自动将字节数转换为KB/MB/GB单位。而--max-depth=1控制递归深度,表示只显示指定目录的直接子目录统计。如果不加路径参数,默认分析当前目录。
举个例子,分析根目录的空间占用:
bash复制$ du -h --max-depth=1 /
12K /lost+found
7.8G /home
24G /var
1.2G /usr
48K /root
33G /
从输出可以立即看出/var和/home是主要空间占用者,接下来可以针对性地深入分析这些目录。
2.2 进阶参数详解
除了基础参数,这些选项在实际工作中非常实用:
-s:只显示汇总结果(summarize),适合快速查看总量
bash复制$ du -sh /var/log
3.4G /var/log
-a:显示所有文件而不仅是目录(all),配合-h使用更佳
bash复制$ du -ah --max-depth=1 /tmp | sort -rh | head -5
2.1G /tmp/large_video.mp4
1.4G /tmp/database_dump.sql
-x:不跨越文件系统边界(one-file-system),避免统计挂载点
bash复制$ du -xh --max-depth=1 /
-t:设置大小阈值(threshold),过滤小文件
bash复制# 只显示大于1GB的目录
$ du -h --max-depth=1 -t 1G /
3. 实战技巧:精准定位空间占用
3.1 快速定位TOP5大目录
结合sort和head命令,可以快速找出占用最大的目录:
bash复制$ du -h --max-depth=1 / | sort -rh | head -5
33G /
24G /var
7.8G /home
1.2G /usr
12K /lost+found
这里sort -rh表示按人类可读的数字逆序排序,head -5显示前5行结果。我在处理一次线上事故时,用这个方法10秒就定位到某个日志目录异常增长到20GB。
3.2 排除特定目录的分析
有时需要排除某些已知的大目录(如挂载的NAS),可以用--exclude参数:
bash复制$ du -h --max-depth=1 --exclude="/mnt" /
更复杂的排除模式可以配合find命令:
bash复制$ find / -type d \( -name "cache" -o -name "temp" \) -prune -o -print | du -h --files0-from=- | sort -rh
3.3 按时间维度分析
du本身不直接支持按时间筛选,但可以结合find实现:
bash复制# 查找最近7天修改的大于100MB的文件
$ find / -type f -size +100M -mtime -7 -exec du -h {} + | sort -rh
4. 高级应用:自动化与脚本集成
4.1 监控脚本示例
这个Bash脚本可以定期记录目录大小变化:
bash复制#!/bin/bash
LOG_FILE="/var/log/disk_usage.log"
TARGET_DIRS=("/var/log" "/tmp" "/home")
echo "==== $(date) ====" >> $LOG_FILE
for dir in "${TARGET_DIRS[@]}"; do
size=$(du -s "$dir" | awk '{print $1}')
echo "$dir: ${size}KB" >> $LOG_FILE
done
设置cron任务每天运行:
bash复制0 3 * * * /path/to/disk_monitor.sh
4.2 与邮件告警集成
当某个目录超过阈值时自动发送告警:
bash复制THRESHOLD=10000000 # 10GB in KB
USAGE=$(du -s /var | awk '{print $1}')
if [ $USAGE -gt $THRESHOLD ]; then
echo "Warning: /var usage exceeded $THRESHOLD KB" | mail -s "Disk Alert" admin@example.com
fi
4.3 可视化分析工具
虽然du是命令行工具,但可以生成可视化报告:
bash复制# 生成CSV格式数据
du -k --max-depth=3 / | awk -F/ '{print $0}' > disk_usage.csv
# 用Excel或Google Sheets生成树状图
5. 避坑指南与性能优化
5.1 常见误区
- 目录大小显示为4KB:这是目录元数据本身的大小,不代表内容实际占用
- 跨文件系统统计:默认会统计挂载点,记得用
-x参数 - 符号链接处理:默认不追踪链接,需要
-L参数才会解引用
5.2 加速技巧
对于超大型文件系统,这些方法可以显著提升速度:
bash复制# 1. 使用更快的排序算法
du -h --max-depth=1 / | sort -rh --parallel=4
# 2. 跳过特定文件系统
du -xh --exclude="/proc" --exclude="/sys" /
# 3. 后台运行并记录结果
nohup du -sh / > du_result.log 2>&1 &
5.3 替代方案对比
当du性能不足时,可以考虑这些工具:
ncdu:交互式磁盘分析工具,适合可视化浏览df:查看文件系统整体使用情况ls -lR:简单场景下的替代方案
记得第一次处理一个包含数百万小文件的目录时,du运行了20分钟还没结束,后来改用find . -type f -printf '%s\n' | awk '{sum+=$1} END {print sum}'才快速得到结果。不同的工具各有适用场景,关键是要了解它们的特性。
