本文深入解析 du (Disk Usage) 命令,涵盖其运行原理、全参数详解、脚本自动化实战、多命令组合技巧、性能调优。
一、核心概念与运行原理
1.1 为什么需要 du?
1.2 运行原理深度解析
du 并非简单读取文件属性,而是通过以下机制工作:
元数据读取:遍历文件系统元数据(inode),统计块(Block)使用情况。
递归累加:自底向上累加每个文件占用的磁盘块,最终汇总到目录层级。
硬链接处理:智能识别硬链接,避免同一物理块被重复计算(除非特定选项)。
单位换算:将底层块数转换为用户可读的 K/M/G/T 单位。
二、基础用法速查表
三、高级选项深度详解
3.1 输出控制类
3.2 单位指定类
-k:强制 1KB 单位(默认行为)。
-m:强制 1MB 单位。
-g:强制 1GB 单位。
-h:智能单位(推荐),自动选择最合适的量级。
3.3 特殊场景类
四、组合拳:与其他命令的终极联用
du 的强大在于管道符 (|) 的配合,实现数据的筛选、排序、统计和格式化。
4.1 与 grep 结合:精准筛选
# 找出大于 100M 的文件或目录du -h /home/user | grep -E '[0-9]+G|[0-9]+M'# 专门查找日志文件占用du -h /home/user | grep "\.log$"
4.2 与 awk 结合:复杂计算
# 计算总字节数du -sb /home/user/* | awk '{sum+=$1} END {print "Total size: " sum " bytes"}'# 找出最大的目录并格式化输出du -s /home/user/* | sort -nr | head -1 | awk '{print "Largest dir: " $2 " (" $1/1024 " MB)"}'
4.3 与 sort 结合:排序分析
# 按大小降序排列(人类可读格式需 -rh)du -h /home/user | sort -rh# 按大小升序排列du -h /home/user | sort -hr
4.4 与 wc 结合:数量统计
# 统计目录下文件和目录的总数du -a /home/user | wc -l# 统计非零占用的条目数du -a /home/user | grep -v "^0" | wc -l
4.5 与 head / tail 结合:截取数据
# 查看 Top 5 最大文件/目录du -ah / | sort -rh | head -n 5# 查看最小的 5 个条目du -ah / | sort -rh | tail -n 5
4.6 与 sed 结合:格式化输出
# 将文件大小前缀替换为星号(自定义格式)du -h /home/user | sed 's/\([0-9]*\)[KMGT]/\*\1\*/'
五、实战脚本模板库
5.1 磁盘空间监控告警脚本
#!/bin/bash# 功能:监控目录大小,超过阈值即告警TARGET_DIR="/var/log"THRESHOLD=500 # MBLOG_FILE="/var/log/disk_monitor.log"USAGE=$(du -sm "$TARGET_DIR" 2>/dev/null | cut -f1)if [ "$USAGE" -gt "$THRESHOLD" ]; then echo "$(date): ⚠️ WARNING: $TARGET_DIR is using ${USAGE}MB (Threshold: ${THRESHOLD}MB)" >> "$LOG_FILE" # 此处可添加发送邮件或钉钉通知的逻辑else echo "$(date): ✅ OK: $TARGET_DIR is using ${USAGE}MB" >> "$LOG_FILE"fi
5.2 自动查找并清理旧文件脚本
#!/bin/bash# 功能:清理 /tmp 下 7 天前的文件,并对比清理前后大小echo "=== 清理前 ==="du -sh /tmp# 执行清理find /tmp -type f -mtime +7 -deleteecho "=== 清理后 ==="du -sh /tmp
5.3 生成详细磁盘分析报告
#!/bin/bashREPORT_FILE="/tmp/disk_report_$(date +%F).txt"{ echo "=== 磁盘空间分析报告 ($(date)) ===" echo "" echo "🔝 Top 10 最大目录:" du -h / 2>/dev/null | sort -rh | head -n 10 echo "" echo "🔝 Top 10 最大文件:" find / -type f -exec du -h {} + 2>/dev/null | sort -rh | head -n 10} > "$REPORT_FILE"echo "报告已生成至: $REPORT_FILE"
六、最佳实践与性能调优
6.1 效率优化技巧
alias duh='du -h'alias duf='du -sh'alias dufull='du -h --max-depth=1'
6.2 常见疑难杂症解决方案
6.3 跨平台兼容性注意
Linux (GNU):支持 --max-depth 长参数。
macOS (BSD):部分参数不同,如限制深度需用 -d 而非 --max-depth。
容器环境:在 Docker 中行为与宿主机一致,但需注意挂载卷的边界(配合 -x 使用)。