du 命令详解#

du 命令是 Linux 系统中用于显示目录或文件大小的命令,是文件操作中常用的命令之一。本文将从入门到无敌,详细介绍 du 命令的使用方法和技巧。

入门阶段#

基本用法#

du 命令的基本语法:

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

功能:显示目录或文件的大小,默认以字节为单位。如果不指定文件或目录,则显示当前目录的大小。

常用示例#

  1. 显示当前目录的大小

    du
  2. 显示指定目录的大小

    du /home
  3. 显示指定文件的大小

    du file.txt
  4. 以人类可读的格式显示

    du -h

中级阶段#

常用选项#

选项说明
-a, --all显示所有文件和目录的大小
-h, --human-readable以人类可读的格式显示(如 K、M、G)
-H, --si以 SI 单位显示(1000 为基数)
-s, --summarize只显示总和,不显示子目录的大小
-c, --total显示所有指定文件或目录的总和
-d, --max-depth=N显示指定深度的目录大小
-k, --kilobytes以 KB 为单位显示
-m, --megabytes以 MB 为单位显示
-g, --gigabytes以 GB 为单位显示
-b, --bytes以字节为单位显示
-L, --dereference跟随符号链接
--help显示帮助信息
--version显示版本信息

组合使用示例#

  1. 显示所有文件和目录的大小

    du -a
  2. 只显示总和

    du -s
  3. 显示总和并以人类可读的格式显示

    du -sh
  4. 显示指定深度的目录大小

    # 显示深度为 1 的目录大小
    du -h --max-depth=1
    
    # 显示深度为 2 的目录大小
    du -h --max-depth=2
  5. 显示所有指定文件或目录的总和

    du -ch file1.txt file2.txt dir1
  6. 跟随符号链接

    du -L file.txt

高级阶段#

高级使用示例#

  1. 使用通配符

    # 显示所有 txt 文件的大小
    du -h *.txt
    
    # 显示所有以 file 开头的文件的大小
    du -h file*
  2. 使用管道

    # 显示大小超过 100MB 的目录
    du -h --max-depth=1 | grep -E "[0-9]+M"
    
    # 按大小排序显示
    du -h --max-depth=1 | sort -hr
  3. 使用重定向

    # 将目录大小保存到文件
    du -h --max-depth=2 > dir_size.txt
  4. 显示指定类型文件的大小

    # 显示所有 txt 文件的大小
    find . -name "*.txt" -type f -exec du -h {} \;
    
    # 显示所有 txt 文件的总大小
    find . -name "*.txt" -type f -exec du -b {} \; | awk '{sum += $1} END {print sum/1024/1024, "MB"}'
  5. 显示目录中最大的文件或目录

    # 显示目录中最大的 10 个文件或目录
    du -h --max-depth=1 | sort -hr | head -n 10
  6. 使用 -0 选项处理包含空格的文件名

    # 处理包含空格的文件名
    find . -name "*.txt" -type f -print0 | xargs -0 du -h

大师阶段#

复杂组合命令#

  1. find 命令结合使用

    # 查找大文件并显示大小
    find . -type f -size +100M 2>/dev/null | xargs du -h
    
    # 查找并删除大文件
    find . -type f -size +100M 2>/dev/null | xargs du -h | sort -hr | head -n 10
  2. xargs 命令结合使用

    # 批量显示文件大小
    ls *.txt | xargs du -h
    
    # 批量显示目录大小
    ls -d */ | xargs du -sh
  3. grep 命令结合使用

    # 显示包含特定字符串的目录大小
    du -h --max-depth=1 | grep "dir"
    
    # 显示不包含特定字符串的目录大小
    du -h --max-depth=1 | grep -v "dir"
  4. awk 命令结合使用

    # 计算目录中文件的平均大小
    du -b --max-depth=2 | grep -v "\.$" | awk '{sum += $1; count++} END {print "平均大小:", sum/count/1024, "KB"}'
    
    # 计算目录中文件的总大小
    du -b --max-depth=2 | grep -v "\.$" | awk '{sum += $1} END {print "总大小:", sum/1024/1024, "MB"}'
  5. sort 命令结合使用

    # 按大小排序显示文件
    du -h *.txt | sort -hr
    
    # 按大小排序显示目录
    du -h --max-depth=1 | sort -hr

与其他命令结合使用#

  1. df 命令结合使用

    # 显示目录大小和磁盘空间使用情况
    du -sh /home && df -h /home
  2. ls 命令结合使用

    # 显示文件大小和详细信息
    ls -la | awk '{print $9, $5}' | sort -k 2 -nr
  3. watch 命令结合使用

    # 实时监控目录大小的变化
    watch -n 1 "du -sh /var/log"
  4. cron 命令结合使用

    # 添加到 crontab 定时执行
    # 编辑 crontab
    # crontab -e
    # 添加以下行,每天检查一次目录大小
    # 0 0 * * * du -h --max-depth=1 /home > /var/log/dir_size.log
  5. tar 命令结合使用

    # 显示压缩前和压缩后的文件大小
    du -sh file.txt && tar -czvf file.txt.tar.gz file.txt && du -sh file.txt.tar.gz

无敌阶段#

自定义 du 命令别名#

为了提高工作效率,可以在 .bashrc.bash_profile 文件中为 du 命令创建别名:

# 在 ~/.bashrc 文件中添加以下内容
alias du='du -h'            # 默认以人类可读的格式显示
aliases du='du -sh'           # 默认只显示总和
aliases dua='du -a'           # 显示所有文件和目录的大小
aliases duc='du -c'           # 显示总和
aliases dud='du --max-depth=1' # 默认显示深度为 1 的目录大小

添加后,执行 source ~/.bashrc 使别名生效。

高级技巧#

  1. 使用 du 命令监控远程服务器的目录大小

    # 监控远程服务器的目录大小
    ssh user@server "du -sh /home"
  2. 使用 du 命令和 tmux 命令结合使用

    # 在 tmux 会话中监控目录大小
    # 启动 tmux 会话
    tmux new -s dir_monitor
    # 在 tmux 会话中执行
    watch -n 1 "du -sh /var/log"
  3. 使用 du 命令和 grafana 命令结合使用

    # 配置 Grafana 监控目录大小
    # 1. 安装 Prometheus 和 Node Exporter
    # 2. 配置 Prometheus 采集 Node Exporter 数据
    # 3. 在 Grafana 中添加 Prometheus 数据源
    # 4. 创建目录大小监控面板
  4. 使用 du 命令和 python 命令结合使用

    # 使用 Python 脚本监控目录大小
    cat > dir_monitor.py << 'EOF'
    #!/usr/bin/env python3
    import subprocess
    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    
    # 执行 du 命令
    result = subprocess.run(['du', '-sh', '/home'], capture_output=True, text=True)
    output = result.stdout.strip()
    
    # 提取目录大小
    size = output.split()[0]
    
    # 检查目录大小
    if 'G' in size:
        size_gb = float(size.replace('G', ''))
        if size_gb > 100:
            # 发送告警邮件
            sender_email = "your_email@example.com"
            receiver_email = "user@example.com"
            password = "your_password"
    
            message = MIMEMultipart()
            message["From"] = sender_email
            message["To"] = receiver_email
            message["Subject"] = "Directory Size Alert"
    
            body = f"Directory /home size is {size}, which exceeds the threshold of 100GB."
            message.attach(MIMEText(body, "plain"))
    
            with smtplib.SMTP_SSL("smtp.example.com", 465) as server:
                server.login(sender_email, password)
                server.send_message(message)
    
    print(f"Directory /home size: {size}")
    EOF
    
    chmod +x dir_monitor.py
    python3 dir_monitor.py
  5. 使用 du 命令和 bash 脚本结合使用

    # 创建 bash 脚本监控目录大小
    cat > dir_monitor.sh << 'EOF'
    #!/bin/bash
    
    # 执行 du 命令
    du -sh /home > /var/log/dir_size.log
    
    # 提取目录大小
    size=$(du -sh /home | awk '{print $1}')
    
    # 检查目录大小
    if [[ $size =~ G ]]; then
        size_gb=${size%"G"}
        if (( $(echo "$size_gb > 100" | bc -l) )); then
            echo "Directory /home size is $size, which exceeds the threshold of 100GB." | mail -s "Directory Size Alert" user@example.com
        fi
    fi
    EOF
    
    chmod +x dir_monitor.sh
    ./dir_monitor.sh
  6. 使用 du 命令和 find 命令结合使用

    # 查找并删除大文件
    find /home -type f -size +100M 2>/dev/null | xargs du -h | sort -hr | head -n 10
    
    # 查找并压缩大文件
    find /home -type f -size +100M 2>/dev/null | xargs -I {} sh -c 'du -h {} && gzip {} && du -h {}.gz'

性能优化#

  1. 使用 -s 选项只显示总和

    # 推荐:只显示总和
    du -s
    
    # 不推荐:显示所有子目录的大小
    du
  2. 使用 --max-depth 选项限制显示深度

    # 推荐:限制显示深度为 1
    du --max-depth=1
    
    # 不推荐:显示所有深度的目录大小
    du
  3. 使用 -h 选项以人类可读的格式显示

    # 推荐:以人类可读的格式显示
    du -h
    
    # 不推荐:以默认格式显示
    du
  4. 对于大目录,使用 -b 选项以字节为单位显示

    # 推荐:以字节为单位显示
    du -b /var
    
    # 不推荐:以默认格式显示
    du /var
  5. 使用 -0 选项和 xargs -0 处理包含空格的文件名

    # 推荐:处理包含空格的文件名
    find . -name "*.txt" -type f -print0 | xargs -0 du -h
    
    # 不推荐:不处理包含空格的文件名
    find . -name "*.txt" -type f | xargs du -h

总结#

du 命令是 Linux 系统中用于显示目录或文件大小的重要命令,掌握其各种选项和使用技巧,可以帮助你更好地管理和监控系统的磁盘空间。从入门到无敌,本文涵盖了 du 命令的所有重要用法,希望对你有所帮助。

常用选项总结#

选项说明
-a, --all显示所有文件和目录的大小
-h, --human-readable以人类可读的格式显示(如 K、M、G)
-H, --si以 SI 单位显示(1000 为基数)
-s, --summarize只显示总和,不显示子目录的大小
-c, --total显示所有指定文件或目录的总和
-d, --max-depth=N显示指定深度的目录大小
-k, --kilobytes以 KB 为单位显示
-m, --megabytes以 MB 为单位显示
-g, --gigabytes以 GB 为单位显示
-b, --bytes以字节为单位显示
-L, --dereference跟随符号链接

最佳实践#

  1. 使用 -h 选项:使用 -h 选项,以人类可读的格式显示目录或文件大小,便于查看。

  2. 使用 -s 选项:对于只需要知道总和的场景,使用 -s 选项,只显示总和,不显示子目录的大小。

  3. 使用 --max-depth 选项:对于大目录,使用 --max-depth 选项,限制显示深度,提高命令执行速度。

  4. 定期检查:定期使用 du 命令检查目录大小,及时发现并处理磁盘空间不足的问题。

  5. 结合其他命令:与 findsortgrep 等命令结合使用,更全面地了解磁盘使用情况。

  6. 性能优化:对于大目录,使用 -s--max-depth 等选项,限制显示内容,提高命令执行速度。

通过不断练习和使用,你将能够熟练掌握 du 命令的各种技巧,成为 Linux 磁盘空间管理的高手。