Linux du 命令 - 磁盘使用分析

du 命令(Disk Usage)用于估算文件和目录的磁盘使用空间。与df命令不同,du是从文件和目录的角度来统计磁盘空间使用情况,特别适合查找占用大量空间的文件或目录。

du 与 df 的区别
  • df:显示文件系统的整体磁盘使用情况(从文件系统层面)
  • du:显示指定文件或目录的磁盘使用情况(从文件层面)
  • 用途:df用于监控磁盘空间剩余,du用于分析哪些文件/目录占用了空间

语法格式

du [选项] [文件或目录...]

如果不指定文件或目录,则显示当前目录及其子目录的磁盘使用情况。

常用选项

选项 说明
-h--human-readable 以易读格式显示(K、M、G)
-s--summarize 仅显示总计,不显示每个子目录的详细情况
-c--total 显示总计信息
--max-depth=N 限制显示目录的深度为N级
-a--all 显示所有文件,包括普通文件(默认只显示目录)
--time 显示文件的最后修改时间
-x--one-file-system 不跨越文件系统边界,只统计当前文件系统
-t SIZE--threshold=SIZE 只显示大小超过SIZE的文件或目录
--exclude=PATTERN 排除匹配PATTERN的文件或目录
-L--dereference 跟踪符号链接指向的实际文件
-l--count-links 如果是硬链接,重复计算其大小

基本示例

示例1:查看当前目录的磁盘使用情况

# 查看当前目录及其所有子目录的磁盘使用情况
du

# 以易读格式显示
du -h

默认以KB为单位显示,使用-h选项会以K、M、G为单位显示,更加直观。

示例2:查看特定目录的大小

# 查看/var/log目录的大小
du -h /var/log

# 查看多个目录的大小
du -h /var/log /tmp /home

示例3:仅显示总计大小

# 只显示目录的总计大小,不显示子目录详情
du -sh /var/log

# 查看多个目录的总计大小并显示总和
du -sch /var/log /tmp /home

示例输出:

12M     /var/log
45M     /tmp
4.2G    /home
4.3G    total

示例4:限制目录深度

# 只显示当前目录下第一级子目录的大小
du -h --max-depth=1

# 显示当前目录下两级子目录的大小
du -h --max-depth=2

高级用法

示例5:显示所有文件的大小

# 显示当前目录下所有文件的磁盘使用情况
du -ah

# 按大小排序显示前10个最大的文件
du -ah | sort -rh | head -10

示例6:查找大文件

# 查找当前目录下大于100M的文件
du -ah | sort -rh | awk '$1 ~ /M$/ && $1+0 > 100'

# 使用find命令结合du查找大文件
find . -type f -size +100M -exec du -h {} \;

示例7:排除特定文件或目录

# 排除所有.log文件
du -h --exclude="*.log"

# 排除多个目录
du -h --exclude=node_modules --exclude=.git

# 排除匹配模式的文件
du -h --exclude="*.tmp" --exclude="*.cache"

示例8:显示修改时间

# 显示文件的最后修改时间和大小
du -ah --time

# 仅显示最近修改的文件
du -ah --time | sort -k2 | tail -20

实际应用场景

场景1:查找磁盘空间占用最大的目录
# 查看当前目录下哪个子目录占用空间最大
du -sh * | sort -rh | head -10
场景2:清理日志文件
# 查看/var/log目录下哪些日志文件最大
du -ah /var/log | sort -rh | head -20

# 找到大日志文件后可以清理
sudo truncate -s 0 /var/log/syslog
场景3:监控目录大小变化
# 使用watch命令实时监控目录大小变化
watch -n 60 'du -sh /var/log'

# 查看指定时间段内的目录大小变化
du -sh /var/log >> log_size_history.txt
date >> log_size_history.txt
场景4:计算项目依赖大小
# 查看node_modules目录大小
du -sh node_modules

# 查看项目中各依赖包的大小
du -sh node_modules/* | sort -rh | head -20

常用组合命令

# 1. 查找当前目录下最大的10个文件或目录
du -sh * | sort -rh | head -10

# 2. 查找指定目录下所有大于100M的文件
find /path/to/dir -type f -size +100M -exec du -h {} \; | sort -rh

# 3. 统计当前目录下不同文件类型的总大小
find . -type f -name "*.jpg" -exec du -ch {} + | grep total
find . -type f -name "*.mp4" -exec du -ch {} + | grep total

# 4. 按月统计目录大小变化
du -sh /var/log > /tmp/log_size_$(date +%Y%m).txt

# 5. 排除隐藏文件查看目录大小
du -sh --exclude=".*" .

注意事项

  • 权限问题:如果没有读取权限,du会报告权限错误,需要使用sudo
  • 符号链接:默认情况下,du会统计符号链接本身的大小,使用-L选项会统计链接指向的实际文件
  • 硬链接:多个硬链接指向同一个文件时,默认只统计一次,使用-l选项会重复计算
  • 跨文件系统:默认会跨越文件系统边界统计,使用-x选项限制在当前文件系统
  • 磁盘块大小:du默认以1KB为单位,但实际统计的是磁盘块(通常为4KB)的使用情况

相关命令

  • df:显示文件系统级别的磁盘使用情况
  • ls:列出目录内容,可显示文件大小
  • find:查找文件,可与du结合使用
  • ncdu:交互式磁盘使用分析工具(需要额外安装)
  • tree:以树状结构显示目录,可显示大小

性能优化技巧

# 1. 对大目录使用-x选项提高速度
du -hx /   # 只统计根文件系统,不跨越其他挂载点

# 2. 限制统计深度避免扫描过多文件
du -h --max-depth=3 /home

# 3. 使用--exclude排除不需要统计的目录
du -h --exclude=node_modules --exclude=.git /project

# 4. 对结果进行排序时注意性能
du -ah /var | sort -rh > /tmp/du_result.txt  # 对大结果先保存再排序
可视化磁盘使用分析工具

除了命令行工具,还有一些可视化工具可以帮助分析磁盘使用情况:

  • ncdu:终端交互式磁盘使用分析工具
  • baobab:GNOME桌面环境的磁盘使用分析器
  • gdmap:图形化磁盘映射工具
  • Filelight:KDE环境的磁盘使用可视化工具

安装示例:sudo apt install ncdu