【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

警惕!OpenClaw隐藏的致命Bug:网络超时误报上下文溢出,可导致系统陷入死循环

救命!我的AI助手OpenClaw深夜疯了!前天晚上开始,如果按照推文时间来算,应该是前天晚上了,OpenClaw像着了魔一样,过一会就在聊天窗口刷屏报错,最后竟然把自己给玩死了! 我们前面介绍了两种方式来给OpenClaw提供近乎无限量的token,一种是对接有免费额度的平台(OpenClaw(原ClawdBot)免费AI模型终极配置指南:精选20+精英模型,打造你的低成本AI军团),另一种是直接“强奸”Antigravity(还在为AI API费用发愁?我找到了免费使用Gemini 3和Claude 4.5的方法)。 我本以为有这么高端的模型,再加上多档回退机制,我本该高枕无忧了,结果是万万没想到,我的OpenClaw遭遇了一场由底层Bug引发的鬼打墙式死循环! 昨天晚上七点半开始,间隔一段时间他就开始自己报错,到今天凌晨不报了,我以为恢复了,结果他又开始报上了! 我分析了一下规律,发现OpenClaw机器人刷屏报错的时间间隔大约是固定的75分钟,报错内容是Context overflow(上下文溢出)、prompt too large(提示词太大)或Agent faile

By Ne0inhk
基于腾讯云MCP广场的AI自动化实践:爬取小红书热门话题

基于腾讯云MCP广场的AI自动化实践:爬取小红书热门话题

基于腾讯云MCP广场的AI自动化实践:爬取小红书热门话题 我正在参加Trae「超级体验官」创意实践征文,本文所使用的 Trae 免费下载链接:www.trae.com.cn/?utm_source… 🔎 背景 在人工智能快速发展的时代,AI技术不仅重塑了传统行业,也极大提高了开发者的工作效率。腾讯云推出的 MCP(Model Context Protocol),作为一种创新的技术协议,能够帮助开发者将云能力、AI模型与自动化流程高效整合,让开发者可以将更多精力集中在业务逻辑和创新上,而不再是重复性工作。 最近,腾讯云推出了**MCP广场,一个帮助开发者轻松创建与管理自动化应用的平台。在探索过程中,我发现了一个非常有趣的工具——超浏览器AI自动化**,它能让开发者通过浏览器模拟技术实现自动化操作。我曾经看到过一个小红书爬取的代码,但由于种种原因没有成功运行。于是,我决定尝试利用超浏览器AI自动化功能,结合腾讯云MCP的能力,进行小红书热门话题的自动化爬取与分析,最终成功实现了这一目标。 📉效果展示 通过本次实践,成功构建了一个自动化流程,它能够: 1. 将提取到的

By Ne0inhk
【Linux网络系列】:打破 HTTP 明文诅咒,在Linux 下用 C++ 手搓 HTTPS 服务器全过程!(附实现源码)

【Linux网络系列】:打破 HTTP 明文诅咒,在Linux 下用 C++ 手搓 HTTPS 服务器全过程!(附实现源码)

🔥 本文专栏:Linux网络 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录:成人的世界里,情绪是最廉价的成本。你可以崩溃,但请记得设置闹钟。哭完之后,账单还在,生活还得继续,最能治愈焦虑的永远不是鸡汤,而是账户里的余额和手里的专业技能。 ★★★ 本文前置知识: Http 引入 在之前的讲解中,我们探讨了HTTP 协议并实现了一个基于HTTP 的 Web 服务器。然而,HTTP存在一个根本性的安全缺陷,即明文传输。我们知道,在客户端(通常为浏览器)与服务端通信的大多数场景中,客户端会向服务端发送GET 或POST 请求。这两种请求均可用于提交数据。对于GET 请求,其提交的表单数据以查询参数的形式附加在请求行中的 URL 之后,表现为键值对。由于 URL 本身存在长度限制,GET 请求只能传递较简单的表单数据,无法传输体积较大的内容(例如文件)。此外,提交后,浏览器地址栏会完整显示

By Ne0inhk
Flutter 组件 assertable_json 的适配 鸿蒙Harmony 实战 - 驾驭结构化 JSON 断言、实现鸿蒙端 API 回包自动化审计与零容错数据校验方案

Flutter 组件 assertable_json 的适配 鸿蒙Harmony 实战 - 驾驭结构化 JSON 断言、实现鸿蒙端 API 回包自动化审计与零容错数据校验方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 assertable_json 的适配 鸿蒙Harmony 实战 - 驾驭结构化 JSON 断言、实现鸿蒙端 API 回包自动化审计与零容错数据校验方案 前言 在鸿蒙(OpenHarmony)生态的金融级应用、大型电商后台以及涉及到敏感信息交换的政务系统中,“数据一致性”是高可用架构的最后一道防线。面对后端返回的动辄数千行、深度嵌套十余层的 JSON 数据流。如果仅仅依靠 data['user']['info']['id'] != null 这种脆弱的手动判空。那么不仅会导致代码中充斥着大量的噪声片段。更会因为某个微小的字段缺失(如:金额字段 amount 变为了 null)

By Ne0inhk