当前位置:首页>Linux>Linux du 命令全景指南:从基础查询到智能运维

Linux du 命令全景指南:从基础查询到智能运维

  • 2026-10-04 19:50:29
Linux du 命令全景指南:从基础查询到智能运维

本文深入解析 du (Disk Usage) 命令,涵盖其运行原理、全参数详解、脚本自动化实战、多命令组合技巧、性能调优。

一、核心概念与运行原理

1.1 为什么需要 du?

  • 精准定位:不同于 df 关注文件系统整体,du 能递归遍历到具体文件和子目录,精准揪出“磁盘杀手”。

  • 故障排查:快速识别导致空间不足的根源。

  • 容量规划:基于历史数据预测存储需求。

  • 自动化监控:作为脚本核心组件,实现自动告警与清理。

1.2 运行原理深度解析

du 并非简单读取文件属性,而是通过以下机制工作:

  1. 元数据读取:遍历文件系统元数据(inode),统计块(Block)使用情况。

  2. 递归累加:自底向上累加每个文件占用的磁盘块,最终汇总到目录层级。

  3. 硬链接处理:智能识别硬链接,避免同一物理块被重复计算(除非特定选项)。

  4. 单位换算:将底层块数转换为用户可读的 K/M/G/T 单位。

二、基础用法速查表

三、高级选项深度详解

3.1 输出控制类

  • -s  (Summary):仅显示总计,隐藏子目录细节。例:du -s /var/log

  • -S (Separate):显示目录大小,但不包含其子目录的大小(仅计算该层级直接拥有的文件)。

  • -c  (Total):在输出末尾增加一行“总计”。例:du -ch /home/*

  • --max-depth=N:限制递归深度。例:du -h --max-depth=1 / (仅看根目录下一级,性能极佳)。

3.2 单位指定类

  • -k:强制 1KB 单位(默认行为)。

  • -m:强制 1MB 单位。

  • -g:强制 1GB 单位。

  • -h:智能单位(推荐),自动选择最合适的量级。

3.3 特殊场景类

  • -x (One-file-system):不跨越文件系统边界。常用于避免统计挂载的其他磁盘分区(如 /mnt/data)。

  • -L (Follow symlinks):跟随符号链接,计算指向文件的实际大小。

  • -D:仅显示符号链接本身的大小(通常很小)。

 四、组合拳:与其他命令的终极联用

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 效率优化技巧

  • 限制深度:在超大目录使用 --max-depth=1 或 2,避免全盘递归导致的 I/O 阻塞。

  • 创建别名:在 .bashrc中添加常用简写:

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 使用)。

最新文章

随机文章