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

【Linux】du 命令查看文件和目录的磁盘占用
在这里插入图片描述
👋 大家好,欢迎来到我的技术博客!
📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。
🎯 本文将围绕Linux这个话题展开,希望能为你带来一些启发或实用的参考。
🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获!

文章目录

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 基本用法示例

$ du4 ./subdir1 8 ./subdir2 12.

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

二、du 命令的基础用法

2.1 显示当前目录的磁盘占用

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

$ du4 ./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"];thenecho"Warning: $TARGET_DIR is using ${USAGE}MB, exceeding threshold of ${THRESHOLD}MB"elseecho"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 结合处理数据

使用 awkdu 命令的输出进行复杂的数据处理。

# 计算所有文件的总大小 $ 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 结合排序

使用 sortdu 命令的输出进行排序。

# 按照大小降序排列 $ 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 与 headtail 结合截取数据

使用 headtail 来截取 du 命令的部分输出。

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

5.6 与 sed 结合格式化输出

使用 seddu 命令的输出进行格式化。

# 将文件大小前缀替换为星号 $ 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 文件中添加别名,提高使用效率。

# 添加到 ~/.bashrcaliasduh='du -h'aliasduf='du -sh'aliasdufull='du -h --max-depth=1'# 重新加载配置 $ source ~/.bashrc # 使用别名 $ duh /home/user $ duf /home/user $ dufull / 

6.3 监控脚本模板

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

#!/bin/bash# 通用磁盘监控脚本check_directory_usage(){localtarget_dir=${1:-"/"}localthreshold=${2:-100}# 默认阈值为 100MBlocallog_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"];thenecho"$(date): WARNING: $target_dir is using ${size}MB, exceeding threshold of ${threshold}MB">>"$log_file"elseecho"$(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 用户可以访问 $ sudodu -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 获取完整信息 $ sudodu -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 世界的旅程中精准定位每一个“磁盘杀手”。


🔗 相关链接


📊 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 命令的各种用法和应用场景。


🙌 感谢你读到这里!
🔍 技术之路没有捷径,但每一次阅读、思考和实践,都在悄悄拉近你与目标的距离。
💡 如果本文对你有帮助,不妨 👍 点赞、📌 收藏、📤 分享 给更多需要的朋友!
💬 欢迎在评论区留下你的想法、疑问或建议,我会一一回复,我们一起交流、共同成长 🌿
🔔 关注我,不错过下一篇干货!我们下期再见!✨

Read more

《C++ 动态规划》第001-002题:第N个泰波拉契数,三步问题

《C++ 动态规划》第001-002题:第N个泰波拉契数,三步问题

🔥个人主页:Cx330🌸 ❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》 《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔 《Git深度解析》:版本管理实战全解 🌟心向往之行必能至 🎥Cx330🌸的简介: 目录 前言: 01.第N个泰波拉契数 算法原理(动态规划): 思路: 解法代码(C++): 博主手记(字体还请见谅哈): 02.三步问题 算法原理(动态规划): 思路: 解法代码(C++): 博主手记(字体还请见谅哈): 结尾: 前言: 聚焦算法题实战,系统讲解三大核心板块:“精准定位最优解”——优选算法,“简化逻辑表达,系统性探索与剪枝优化”——递归与回溯,“以局部最优换全局高效”——贪心算法,讲解思路与代码实现,帮助大家快速提升代码能力 01.

By Ne0inhk
【C++】AVL树的底层以及实现

【C++】AVL树的底层以及实现

个人主页 文章目录 * ⭐一、AVL树的概念 * 🎉二、AVL树的性质 * 🏝️三、AVL树的实现 * 1. 树的基本结构 * 2. 树的插入 * 3. 树的旋转 * • 左单旋 * • 右单旋 * • 左右双旋 * • 右左双旋 * 🎡四、AVL树的其它功能 * 1. 树的查找 * 2. 树的遍历 * 3. 树的高度 * 4. 树的大小 * 🚀五、总结 * 1. AVL树的优缺点 * 2. 完整代码 ⭐一、AVL树的概念 AVL树是一种高度平衡的平衡二叉树,相比于搜索二叉树,它的特点在于左右子树都为AVL树且树的高度差的绝对值不超过1。 这里我们会引入一个新的概念叫做平衡因子。平衡因子也就是左右子树的高度差,我们可以通过平衡因子方便我们后续去观察和控制树是否平衡。 🎉二、AVL树的性质 AVL树主要有三大性质: 1.每棵树的左右子树都是AVL树。 2.左子树和右子树的高度之差的绝对值不超过1。 3.

By Ne0inhk
Java选择结构全解析:if与switch实战

Java选择结构全解析:if与switch实战

1.选择结构:根据条件,选择执行某一部分代码 (1).单分支if选择结构 执行规则:判断条件,如果条件为true,执行{}中的代码块m,执行完代码块结束if结构,继续往下执行if结构后面的代码,如果条件为false,直接跳过if结构,执行if结构后面的代码。注意事项:条件不管是多么简单还是多么复杂,结果都只能是一个布尔值,要么为true,要么为false。 import java.util.Scanner; public class Demo12 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个整数"); int num = scanner.nextInt(

By Ne0inhk
拒绝重复造轮子:利用自定义注解封装POI,实现Java通用Excel解析

拒绝重复造轮子:利用自定义注解封装POI,实现Java通用Excel解析

基于 SSM + Vue 的 POI Excel 导入导出全流程实现 本文详细讲解基于 SSM(Spring + SpringMVC + MyBatis)后端与 Vue + Element UI 前端的 Excel 导入导出功能实现。通过自定义注解的方式,实现通用的 POI 操作流程。 1. 环境准备与依赖引入 首先需要在项目的 pom.xml 中引入 Apache POI 及相关工具类的依赖。 <!-- POI 核心依赖(支持 .xls 格式 - Office 2003) --><dependency><groupId>

By Ne0inhk