【Linux】du 命令查看文件和目录的磁盘占用

Linux du 命令详解:精准探查文件和目录的磁盘占用
在 Linux 系统管理中,磁盘空间的精确管理是确保系统稳定运行的关键环节。当我们遇到磁盘空间不足、系统响应缓慢或存储资源紧张等问题时,准确找出占用磁盘空间最多的文件和目录就显得尤为重要。du 命令(英文全称:disk usage)正是解决这一难题的强大工具。它能够递归地计算文件和目录所占用的磁盘空间,帮助我们快速定位“磁盘杀手”,为系统优化和存储规划提供坚实的数据支持。掌握 du 命令的精髓,不仅能提升我们的工作效率,更能让我们在复杂的存储环境中游刃有余。

一、du 命令简介
du 命令(英文全称:disk usage)是 Linux 系统中一个用于估算文件和目录磁盘使用的命令行工具。它能够递归地遍历文件系统,计算每个文件和目录所占用的磁盘空间,并以易于理解的方式展示出来。无论是排查大文件、优化存储空间,还是进行容量规划,du 命令都是系统管理员和普通用户不可或缺的利器。

1.1 为什么使用 du?
精准定位:准确找出占用磁盘空间最多的文件和目录。
故障排查:快速识别导致磁盘空间不足的原因。
性能优化:通过分析文件大小优化系统性能。
容量规划:为未来的存储需求提供数据依据。
自动化监控:在脚本中用于磁盘使用情况的监控和告警。
1.2 du 命令的运行原理
du 命令通过读取文件系统的元数据来计算磁盘使用情况。它会递归地遍历指定目录下的所有子目录和文件,累加每个文件的大小,并最终给出总计。du 命令可以处理硬链接(hard links),在计算时会考虑硬链接的情况,避免重复计算。

1.3 基本用法示例
$ du
4 ./subdir1
8 ./subdir2
12 .

这个简单的命令会显示当前目录下所有子目录和文件的磁盘占用情况(以 1K 块为单位)。输出格式为:占用空间(单位:1K 块) + 文件或目录路径。

二、du 命令的基础用法
2.1 显示当前目录的磁盘占用
最基础的用法是直接运行 du 命令,显示当前目录及其子目录的磁盘占用情况。

$ du
4 ./subdir1
8 ./subdir2
12 .

2.2 显示指定目录的磁盘占用
可以指定特定目录来查看其磁盘占用情况。

$ du /home/user
4 /home/user/subdir1
8 /home/user/subdir2
12 /home/user

2.3 显示指定目录下所有文件和目录的占用
使用 -a 选项可以显示指定目录下所有文件和目录的占用情况,而不是只显示目录本身的大小。

$ du -a /home/user
4 /home/user/subdir1/file1.txt
8 /home/user/subdir2/file2.txt
4 /home/user/subdir1
8 /home/user/subdir2
12 /home/user

2.4 以人类 可读格式显示
使用 -h 选项可以将以 1K 块为单位的数字转换为更易读的格式(K, M, G, T)。

$ du -h /home/user
4.0K /home/user/subdir1/file1.txt
8.0K /home/user/subdir2/file2.txt
4.0K /home/user/subdir1
8.0K /home/user/subdir2
12K /home/user

三、du 命令的高级选项详解
3.1 -s 选项:只显示总计
-s 选项用于只显示指定目录的总计磁盘占用,而不显示其子目录的详细信息。

$ du -s /home/user
12K /home/user

3.2 -c 选项:显示总计
-c 选项可以在输出末尾显示所有文件和目录的总计。

$ du -c /home/user
4.0K /home/user/subdir1/file1.txt
8.0K /home/user/subdir2/file2.txt
4.0K /home/user/subdir1
8.0K /home/user/subdir2
12K /home/user
total 12K

3.3 -h 选项:人类可读格式
-h 选项将输出以人类可读的格式显示,自动选择合适的单位(K, M, G, T)。

$ du -h /home/user
4.0K /home/user/subdir1/file1.txt
8.0K /home/user/subdir2/file2.txt
4.0K /home/user/subdir1
8.0K /home/user/subdir2
12K /home/user

3.4 -k 选项:以 1K 块为单位显示
-k 选项强制以 1K 块为单位显示磁盘空间,这是 du 命令的默认行为。

$ du -k /home/user
4 /home/user/subdir1/file1.txt
8 /home/user/subdir2/file2.txt
4 /home/user/subdir1
8 /home/user/subdir2
12 /home/user

3.5 -m 选项:以 1M 块为单位显示
-m 选项以 1M 块为单位显示磁盘空间。

$ du -m /home/user
0 /home/user/subdir1/file1.txt
0 /home/user/subdir2/file2.txt
0 /home/user/subdir1
0 /home/user/subdir2
0 /home/user

3.6 -g 选项:以 1G 块为单位显示
-g 选项以 1G 块为单位显示磁盘空间。

$ du -g /home/user
0 /home/user/subdir1/file1.txt
0 /home/user/subdir2/file2.txt
0 /home/user/subdir1
0 /home/user/subdir2
0 /home/user

3.7 -S 选项:不包括子目录
-S 选项用于不包括子目录的大小,只显示目录本身的大小。

$ du -S /home/user
4.0K /home/user/subdir1/file1.txt
8.0K /home/user/subdir2/file2.txt
12K /home/user

3.8 -x 选项:不跨越文件系统边界
-x 选项用于不跨越文件系统边界进行计算,只计算当前文件系统内的占用。

$ du -x /home/user
4.0K /home/user/subdir1/file1.txt
8.0K /home/user/subdir2/file2.txt
4.0K /home/user/subdir1
8.0K /home/user/subdir2
12K /home/user

3.9 -D 选项:显示符号链接的大小
-D 选项用于显示符号链接本身的大小,而不是它指向的目标文件的大小。

$ du -D /home/user
4.0K /home/user/subdir1/file1.txt
8.0K /home/user/subdir2/file2.txt
4.0K /home/user/subdir1
8.0K /home/user/subdir2
12K /home/user

3.10 -L 选项:跟随符号链接
-L 选项用于跟随符号链接,计算符号链接指向的文件的实际大小。

$ du -L /home/user
4.0K /home/user/subdir1/file1.txt
8.0K /home/user/subdir2/file2.txt
4.0K /home/user/subdir1
8.0K /home/user/subdir2
12K /home/user

四、du 命令在脚本中的应用
4.1 磁盘空间监控脚本
编写一个简单的脚本来监控特定目录的磁盘使用情况。

#!/bin/bash

# 磁盘空间监控脚本
TARGET_DIR="/home/user"
THRESHOLD=100 # 设置阈值为 100MB

# 获取磁盘使用情况
USAGE=$(du -sm "$TARGET_DIR" 2>/dev/null | cut -f1)

# 检查是否超过阈值
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "Warning: $TARGET_DIR is using ${USAGE}MB, exceeding threshold of ${THRESHOLD}MB"
else
echo "OK: $TARGET_DIR is using ${USAGE}MB"
fi

4.2 查找最大文件脚本
编写一个脚本来查找目录中最大的文件。

#!/bin/bash

# 查找最大文件的脚本
TARGET_DIR="/home/user"
MAX_FILES=5 # 显示前 5 个最大的文件

echo "Top $MAX_FILES largest files in $TARGET_DIR:"
du -ah "$TARGET_DIR" 2>/dev/null | sort -rh | head -"$MAX_FILES"

4.3 定期清理脚本
结合 du 命令和 find 命令,编写一个自动清理脚本。

#!/bin/bash

# 清理 /tmp 目录中超过 7 天的文件
# 先检查 /tmp 目录的磁盘使用情况
echo "Before cleanup:"
du -sh /tmp 2>/dev/null

# 清理旧文件
find /tmp -type f -mtime +7 -delete 2>/dev/null

# 检查清理后的磁盘使用情况
echo "After cleanup:"
du -sh /tmp 2>/dev/null

4.4 磁盘空间报告生成
生成详细的磁盘空间报告。

#!/bin/bash

# 生成磁盘空间报告
REPORT_FILE="/tmp/disk_report_$(date +%Y%m%d_%H%M%S).txt"

{
echo "Disk Space Report - $(date)"
echo "================================="
echo ""
echo "1. Top 10 Largest Directories:"
echo "-------------------------------"
du -h / 2>/dev/null | sort -rh | head -10

echo ""
echo "2. Top 10 Largest Files:"
echo "------------------------"
find / -type f -exec du -h {} \; 2>/dev/null | sort -rh | head -10

echo ""
echo "3. Current Directory Usage:"
echo "---------------------------"
du -h . 2>/dev/null | sort -rh | head -10

} > "$REPORT_FILE"

echo "Report generated: $REPORT_FILE"

五、du 命令与其他命令的结合使用
5.1 与 grep 结合筛选特定信息
使用 grep 过滤 du 命令的输出,获取特定信息。

# 查找大于 100MB 的文件或目录
$ du -h /home/user | grep -E '[0-9]+G|[0-9]+M'
1.2G /home/user/large_dir
512M /home/user/big_file.zip

# 查找特定类型的文件
$ du -h /home/user | grep "\.log$"
1.2K /home/user/app.log
2.4K /home/user/error.log

5.2 与 awk 结合处理数据
使用 awk 对 du 命令的输出进行复杂的数据处理。

# 计算所有文件的总大小
$ du -sb /home/user/* 2>/dev/null | awk '{sum += $1} END {print "Total size: " sum " bytes"}'

# 找出使用空间最大的目录
$ du -s /home/user/* 2>/dev/null | sort -nr | head -1
10485760 /home/user/large_dir

5.3 与 sort 结合排序
使用 sort 对 du 命令的输出进行排序。

# 按照大小降序排列
$ du -h /home/user | sort -rh

# 按照大小升序排列
$ du -h /home/user | sort -hr

5.4 与 wc 结合统计行数
使用 wc 统计 du 命令输出的行数。

# 统计目录下文件和目录的数量
$ du -a /home/user | wc -l
15

# 统计非空行的数量
$ du -a /home/user | grep -v "^0" | wc -l
10

5.5 与 head 和 tail 结合截取数据
使用 head 和 tail 来截取 du 命令的部分输出。

# 显示前 5 个最大的文件或目录
$ du -h /home/user | sort -rh | head -5

# 显示最后 5 个文件或目录
$ du -h /home/user | sort -rh | tail -5

5.6 与 sed 结合格式化输出
使用 sed 对 du 命令的输出进行格式化。

# 将文件大小前缀替换为星号
$ du -h /home/user | sed 's/\([0-9]*\)[KMGT]/\*\1\*/'

六、du 命令的实用技巧与最佳实践
6.1 快速查看大文件或目录
结合 du 命令和 sort 命令,快速定位占用空间大的文件或目录。

# 查看根目录下最大的目录
$ du -h / | sort -rh | head -10

# 查看当前目录下最大的文件
$ du -ah | sort -rh | head -10

6.2 创建别名简化操作
在 .bashrc 文件中添加别名,提高使用效率。

# 添加到 ~/.bashrc
alias duh='du -h'
alias duf='du -sh'
alias dufull='du -h --max-depth=1'

# 重新加载配置
$ source ~/.bashrc

# 使用别名
$ duh /home/user
$ duf /home/user
$ dufull /

6.3 监控脚本模板
创建一个通用的磁盘监控脚本模板。

#!/bin/bash

# 通用磁盘监控脚本
check_directory_usage() {
local target_dir=${1:-"/"}
local threshold=${2:-100} # 默认阈值为 100MB
local log_file=${3:-"/var/log/disk_monitor.log"}

echo "$(date): Checking usage of $target_dir..." >> "$log_file"

# 获取目录大小
size=$(du -sm "$target_dir" 2>/dev/null | cut -f1)

if [ "$size" -gt "$threshold" ]; then
echo "$(date): WARNING: $target_dir is using ${size}MB, exceeding threshold of ${threshold}MB" >> "$log_file"
else
echo "$(date): OK: $target_dir is using ${size}MB" >> "$log_file"
fi
}

# 调用函数
check_directory_usage "/"

6.4 处理硬链接和符号链接
du 命令在处理硬链接时会特别注意,避免重复计算。

# 创建硬链接测试
$ touch file1.txt
$ ln file1.txt file2.txt

# 查看硬链接的大小
$ du -h file1.txt file2.txt
4.0K file1.txt
4.0K file2.txt

# 使用 -S 选项,不包括子目录
$ du -S -h /home/user
4.0K /home/user/subdir1/file1.txt
8.0K /home/user/subdir2/file2.txt
12K /home/user

七、du 命令的性能考量与注意事项
7.1 性能影响
du 命令的性能取决于所遍历的目录层级和文件数量。对于大型目录树,du 命令可能会花费较长时间。可以通过使用 -max-depth 选项来限制递归深度,从而提高性能。

7.2 内存使用
du 命令的内存占用相对较小,但在处理大量文件时,可能会暂时占用较多内存。

7.3 磁盘 I/O
du 命令需要读取文件系统元数据,对磁盘 I/O 有一定影响,尤其是在处理大量小文件时。

7.4 权限要求
在某些情况下,du 命令可能需要 root 权限才能读取某些受保护的文件或目录。

# 普通用户可能无法访问某些目录
$ du -h /root
du: cannot access '/root': Permission denied

# root 用户可以访问
$ sudo du -h /root
4.0K /root/.bashrc
8.0K /root/.profile
12K /root

八、du 命令的跨平台兼容性
8.1 不同 Unix/Linux 发行版
du 命令在大多数 Unix 和 Linux 系统中都可用,包括 Ubuntu、CentOS、Fedora、Debian、Arch Linux 等。不同发行版的默认行为基本一致,但某些选项可能略有差异。

8.2 与 macOS 的兼容性
在 macOS 系统中,du 命令也存在,但部分选项可能与 Linux 系统略有不同。

# macOS 中的 du 命令
$ du -h /Applications
1.2G /Applications

8.3 在容器环境中的表现
在 Docker 等容器环境中,du 命令同样正常工作,其行为与宿主机一致。

$ docker run -it ubuntu bash
root@container:/# du -h /
4.0K /bin
8.0K /boot
...

九、du 命令的常见问题与解决方案
9.1 磁盘空间显示异常
问题描述
du 命令显示的磁盘空间与 df 命令显示的不一致。

解决方案
# 检查是否有进程正在使用已删除的文件
$ lsof +L1

# 检查文件系统状态
$ df -h

# 使用 -S 选项避免子目录计算
$ du -S -h /home/user

9.2 命令执行缓慢
问题描述
在大型目录中使用 du 命令时执行速度慢。

解决方案
# 使用 -max-depth 选项限制递归深度
$ du -h --max-depth=2 /home/user

# 只计算特定类型文件
$ find /home/user -type f -name "*.log" -exec du -h {} \;

9.3 权限问题导致信息缺失
问题描述
普通用户无法查看某些目录的详细信息。

解决方案
# 使用 sudo 获取完整信息
$ sudo du -h /root

# 或者检查目录权限
$ ls -ld /root
drwx------ 2 root root 4096 Jan 1 00:00 /root

9.4 硬链接重复计算问题
问题描述
在某些情况下,硬链接可能导致重复计算。

解决方案
# 使用 -S 选项避免子目录计算
$ du -S -h /home/user

# 使用 -L 选项跟随符号链接
$ du -L -h /home/user

十、du 命令的未来发展方向
10.1 更智能的磁盘分析
未来的 du 命令可能会集成更智能的分析功能,例如自动识别潜在的存储问题、预测存储需求等。

10.2 与云存储集成
随着云计算的发展,du 命令可能会更好地支持云存储服务的磁盘空间监控。

10.3 更丰富的可视化支持
du 命令可能会提供更多的可视化选项,如图形化界面或图表展示。

10.4 更完善的 API 支持
为了更好地与其他监控和管理系统集成,du 命令可能会提供更完善的 API 支持。

十一、总结
du 命令作为 Linux 系统中一个强大而灵活的工具,其在磁盘空间管理中的作用不容小觑。从基础的目录大小查看到复杂的脚本集成,du 命令都能提供可靠的支持。通过本文的详细介绍,我们不仅掌握了 du 命令的基础用法和各种选项,还深入了解了它在脚本中的应用、与其他命令的结合使用、性能考量以及常见问题的解决方法。

du 命令的简洁性和高效性使其成为 Linux 用户和系统管理员的首选工具之一。无论是日常的磁盘监控、故障排查,还是复杂的存储管理任务,du 命令都能以最小的开销提供最大的便利。它的跨平台兼容性也保证了在不同环境下的稳定使用。

在日常的 Linux 使用和系统管理工作中,du 命令无处不在。它不仅是初学者入门 Linux 的第一课,也是资深用户进行复杂任务时的得力助手。从简单的文件大小查看到复杂的容量规划,du 都能以其简洁优雅的方式满足需求。

记住,掌握 du 命令不仅仅是学会如何查看文件和目录的磁盘占用,更是理解和构建 Linux 系统存储管理生态的重要一步。在不断探索和实践中,你会发现 du 命令在各种场景下的无限可能性。它就像一个磁盘空间的侦探,帮助我们在 Linux 世界的旅程中精准定位每一个“磁盘杀手”。

🔗 相关链接
Linux du 命令官方手册页 - 官方文档,最权威的参考。
Linux df 命令详解 - 学习如何使用 df 命令查看磁盘空间使用情况。
Linux 磁盘空间管理指南 - 深入了解 Linux 系统中的磁盘空间管理策略。
Linux 系统监控工具推荐 - 探索更多实用的 Linux 系统监控工具。
Bash 脚本编程技巧 - 学习如何在 Bash 脚本中高效使用各种命令。
📊 Mermaid 图表:du 命令功能结构图
未来趋势

问题解决

实用技巧

组合使用

脚本应用

格式化选项

基础显示

核心功能

du 命令

基础显示

格式化选项

脚本应用

组合使用

实用技巧

问题解决

未来趋势

当前目录

指定目录

所有文件

目录详情

-s 只显示总计

-c 显示总计

-h 人类可读

-k 1K 块

-m 1M 块

-g 1G 块

-S 不包括子目录

-x 不跨越文件系统

-D 显示符号链接

-L 跟随符号链接

监控脚本

查找最大文件

自动清理

报告生成

与 grep 结合

与 awk 结合

与 sort 结合

与 wc 结合

与 head/tail 结合

与 sed 结合

别名设置

监控模板

硬链接处理

性能优化

空间显示异常

执行缓慢

权限问题

硬链接问题

智能分析

云存储集成

可视化支持

API 支持

这个图表清晰地展示了 du 命令的主要功能模块及其相互关系,涵盖了从基础显示到复杂应用的各个方面,帮助读者更好地理解和记忆 du 命令的各种用法和应用场景。

————————————————
版权声明:本文为CSDN博主「Jinkxs」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41187124/article/details/157360659

上一篇 RSR20-X ospf建立后路由不加表