Skip to content

du 命令:深入分析磁盘使用情况的利器

1. 命令简介

du(Disk Usage 的缩写)是一个强大的 Unix/Linux 命令行工具,用于估算文件和目录的磁盘空间使用情况。与 df 命令不同,du 可以深入到文件系统的目录结构中,提供更详细的磁盘使用分析。这个命令在系统管理、存储优化和故障排查中非常有用。

2. 基本语法

bash
du [选项] [文件...]

3. 常用选项详解

  • -h--human-readable: 以人类可读的格式显示大小(如 K, M, G)
  • -s--summarize: 仅显示总计
  • -c--total: 显示总计和所有参数的总和
  • -a--all: 显示所有文件的大小,而不仅仅是目录
  • -d N--max-depth=N: 显示目录总计的最大深度
  • --apparent-size: 显示表面大小而不是磁盘使用量
  • --time: 显示最后修改时间
  • -x--one-file-system: 跳过不同文件系统上的目录

4. 基础用法示例

4.1 显示当前目录及其子目录的磁盘使用情况

bash
du -h

输出示例:

4.0K    ./dir1/subdir1
8.0K    ./dir1
4.0K    ./dir2
16K     .

4.2 显示特定目录的总磁盘使用量

bash
du -sh /home/user

输出示例:

5.2G    /home/user

4.3 显示多个目录的磁盘使用情况

bash
du -sh /var /opt /usr

输出示例:

1.2G    /var
420M    /opt
4.8G    /usr

5. 高级用法和技巧

5.1 按大小排序显示目录

bash
du -h /path/to/directory | sort -rh | head -n 10

这将显示指定目录下最大的 10 个子目录或文件。

5.2 显示指定深度的目录使用情况

bash
du -h --max-depth=2 /

这将显示根目录下两层深度的磁盘使用情况。

5.3 排除特定目录

bash
du -h / --exclude=/proc --exclude=/sys

这将显示根目录的磁盘使用情况,但排除 /proc 和 /sys 目录。

5.4 只显示超过特定大小的文件或目录

bash
du -h /path | awk '$1 ~ /G/ {print $0}'

这将只显示大小为 GB 级别的文件或目录。

6. 实际应用场景

6.1 查找并删除大文件

bash
#!/bin/bash
# find_and_delete_large_files.sh

DIRECTORY="/path/to/search"
SIZE="100M"  # 设置大文件的阈值,这里是 100MB

echo "Finding files larger than $SIZE in $DIRECTORY"
find "$DIRECTORY" -type f -size +$SIZE -print0 | xargs -0 du -h | sort -rh

echo "Do you want to delete these files? (y/n)"
read answer

if [ "$answer" = "y" ]; then
    find "$DIRECTORY" -type f -size +$SIZE -delete
    echo "Files deleted."
else
    echo "Operation cancelled."
fi

这个脚本会找出指定目录下超过特定大小的文件,并给用户选择是否删除这些文件。

6.2 创建磁盘使用报告

bash
#!/bin/bash
# disk_usage_report.sh

REPORT_FILE="disk_usage_report_$(date +%Y%m%d).txt"

echo "Disk Usage Report - $(date)" > $REPORT_FILE
echo "=======================================" >> $REPORT_FILE

echo -e "\nLargest Directories:" >> $REPORT_FILE
du -h / 2>/dev/null | sort -rh | head -n 20 >> $REPORT_FILE

echo -e "\nLargest Files:" >> $REPORT_FILE
find / -type f -exec du -Sh {} + 2>/dev/null | sort -rh | head -n 20 >> $REPORT_FILE

echo -e "\nFile Types and Their Total Sizes:" >> $REPORT_FILE
find / -type f -name '*.*' 2>/dev/null | sed 's|.*\.||' | sort | uniq -c | sort -rn | head -n 20 >> $REPORT_FILE

echo "Report generated: $REPORT_FILE"

这个脚本创建一个详细的磁盘使用报告,包括最大的目录、文件以及按文件类型统计的使用情况。

7. 性能考虑

  • 对于大型文件系统,du 可能需要较长时间执行,特别是使用 -a 选项时。
  • 使用 --apparent-size 选项可能会更快,但可能不会反映实际的磁盘使用情况。
  • 在有大量小文件的目录中,du 可能会很慢。考虑使用 -S 选项来分别显示目录的总大小。

8. 安全注意事项

  • 在多用户系统中,普通用户可能无法访问某些目录,导致不完整的结果。
  • 避免在公开脚本中硬编码敏感的文件路径。
  • 在执行自动化清理脚本时要格外小心,确保不会删除重要文件。

9. 与其他工具的集成

  • 结合 find 命令可以进行更复杂的文件搜索和大小分析。
  • awk, sed, sort 等命令配合使用可以实现更高级的数据处理和展示。
  • 可以与 cron 结合使用,定期生成磁盘使用报告。

10. 故障排除

  • 如果 du 显示的大小与预期不符,检查是否有隐藏文件或者符号链接导致的重复计算。
  • 在 NFS 或其他网络文件系统上,du 可能会变得非常慢。考虑使用 -x 选项限制在单一文件系统内。
  • 如果遇到权限问题,可以使用 sudo 运行 du,但要谨慎使用。

11. 相关命令

  • df: 报告文件系统磁盘空间使用情况
  • ncdu: 提供交互式的磁盘使用分析
  • find: 搜索文件和目录
  • ls: 列出目录内容
  • sort: 对文本进行排序
  • xargs: 从标准输入构建和执行命令行

通过掌握这些 du 命令的高级用法和技巧,系统管理员和开发人员可以更有效地分析和管理磁盘空间,优化存储使用,并快速识别可能的问题区域。