跳到主要内容
Linux du 命令详解:精准探查文件和目录的磁盘占用 | 极客日志
Shell / Bash
Linux du 命令详解:精准探查文件和目录的磁盘占用 Linux du 命令用于计算文件和目录的磁盘使用量。通过递归遍历文件系统,它能快速定位占用空间大的文件。常用参数包括-h 显示人类可读格式、-s 显示总计、-a 列出所有文件。结合 sort 和 head 可排序查找最大项。脚本中可用于监控告警。需注意与 df 命令的差异及权限问题。
嘘 发布于 2026/3/15 更新于 2026/4/27 5 浏览Linux du 命令详解:精准探查文件和目录的磁盘占用
在 Linux 系统管理中,磁盘空间的精确管理是确保系统稳定运行的关键环节。当我们遇到磁盘空间不足、系统响应缓慢或存储资源紧张等问题时,准确找出占用磁盘空间最多的文件和目录就显得尤为重要。du 命令(英文全称:disk usage)正是解决这一难题的强大工具。它能够递归地计算文件和目录所占用的磁盘空间,帮助我们快速定位'磁盘杀手',为系统优化和存储规划提供坚实的数据支持。
一、du 命令简介
du 命令是 Linux 系统中一个用于估算文件和目录磁盘使用的命令行工具。它会递归地遍历文件系统,计算每个文件和目录所占用的磁盘空间,并以易于理解的方式展示出来。无论是排查大文件、优化存储空间,还是进行容量规划,du 命令都是系统管理员和普通用户不可或缺的利器。
为什么使用 du?
精准定位 :准确找出占用磁盘空间最多的文件和目录。
故障排查 :快速识别导致磁盘空间不足的原因。
性能优化 :通过分析文件大小优化系统性能。
容量规划 :为未来的存储需求提供数据依据。
自动化监控 :在脚本中用于磁盘使用情况的监控和告警。
运行原理
du 命令通过读取文件系统的元数据来计算磁盘使用情况。它会递归地遍历指定目录下的所有子目录和文件,累加每个文件的大小,并最终给出总计。du 命令可以处理硬链接(hard links),在计算时会考虑硬链接的情况,避免重复计算。
基本用法示例
$ du ./subdir1 4 ./subdir2 8 .
这个简单的命令会显示当前目录下所有子目录和文件的磁盘占用情况(以 1K 块为单位)。输出格式为:占用空间(单位:1K 块) + 文件或目录路径。
二、du 命令的基础用法
显示当前目录的磁盘占用
最基础的用法是直接运行 du 命令,显示当前目录及其子目录的磁盘占用情况。
$ du ./subdir1 4 ./subdir2 8 .
显示指定目录的磁盘占用
可以指定特定目录来查看其磁盘占用情况。
$ du /home/user 4 /home/user/subdir1 8 /home/user/subdir2 12 /home/user
显示指定目录下所有文件和目录的占用
使用 -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
以人类可读格式显示
使用 -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 命令的高级选项详解
-s 选项:只显示总计 -s 选项用于只显示指定目录的总计磁盘占用,而不显示其子目录的详细信息。
$ du -s /home/user 12K /home/user
-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
-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
-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
-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
-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
-S 选项:不包括子目录 -S 选项用于不包括子目录的大小,只显示目录本身的大小。
$ du -S /home/user 4.0K /home/user/subdir1/file1.txt 8.0K /home/user/subdir2/file2.txt 12K /home/user
-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
-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
-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 命令在脚本中的应用
磁盘空间监控脚本 #!/bin/bash
TARGET_DIR="/home/user"
THRESHOLD=100
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
查找最大文件脚本 #!/bin/bash
TARGET_DIR="/home/user"
MAX_FILES=5
echo "Top $MAX_FILES largest files in $TARGET_DIR :"
du -ah "$TARGET_DIR " 2>/dev/null | sort -rh | head -"$MAX_FILES "
定期清理脚本 结合 du 命令和 find 命令,编写一个自动清理脚本。
#!/bin/bash
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
磁盘空间报告生成 #!/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 命令与其他命令的结合使用
与 grep 结合筛选特定信息 使用 grep 过滤 du 命令的输出,获取特定信息。
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
与 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
与 sort 结合排序
du -h /home/user | sort -rh
du -h /home/user | sort -hr
与 wc 结合统计行数
du -a /home/user | wc -l
15
du -a /home/user | grep -v "^0" | wc -l
10
与 head 和 tail 结合截取数据 使用 head 和 tail 来截取 du 命令的部分输出。
du -h /home/user | sort -rh | head -5
du -h /home/user | sort -rh | tail -5
与 sed 结合格式化输出
du -h /home/user | sed 's/\([0-9]*\)[KMGT]/\*\1\*/'
六、du 命令的实用技巧与最佳实践
快速查看大文件或目录 结合 du 命令和 sort 命令,快速定位占用空间大的文件或目录。
du -h / | sort -rh | head -10
du -ah | sort -rh | head -10
创建别名简化操作 在 .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 /
监控脚本模板 #!/bin/bash
check_directory_usage (){
local target_dir=${1:-"/"}
local threshold=${2:-100}
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 "/"
处理硬链接和符号链接 du 命令在处理硬链接时会特别注意,避免重复计算。
touch file1.txt
ln file1.txt file2.txt
du -h file1.txt file2.txt
4.0K file1.txt
4.0K file2.txt
du -S -h /home/user
4.0K /home/user/subdir1/file1.txt
8.0K /home/user/subdir2/file2.txt
12K /home/user
七、du 命令的性能考量与注意事项
性能影响 du 命令的性能取决于所遍历的目录层级和文件数量。对于大型目录树,du 命令可能会花费较长时间。可以通过使用 -max-depth 选项来限制递归深度,从而提高性能。
内存使用 du 命令的内存占用相对较小,但在处理大量文件时,可能会暂时占用较多内存。
磁盘 I/O du 命令需要读取文件系统元数据,对磁盘 I/O 有一定影响,尤其是在处理大量小文件时。
权限要求 在某些情况下,du 命令可能需要 root 权限才能读取某些受保护的文件或目录。
du -h /root
du : cannot access '/root' : Permission denied
sudo du -h /root
4.0K /root/.bashrc
8.0K /root/.profile
12K /root
八、du 命令的跨平台兼容性
不同 Unix/Linux 发行版 du 命令在大多数 Unix 和 Linux 系统中都可用,包括 Ubuntu、CentOS、Fedora、Debian、Arch Linux 等。不同发行版的默认行为基本一致,但某些选项可能略有差异。
与 macOS 的兼容性 在 macOS 系统中,du 命令也存在,但部分选项可能与 Linux 系统略有不同。
du -h /Applications
1.2G /Applications
在容器环境中的表现 在 Docker 等容器环境中,du 命令同样正常工作,其行为与宿主机一致。
$ docker run -it ubuntu bash
root@container:/# du -h /
4.0K /bin
8.0K /boot
...
九、du 命令的常见问题与解决方案
磁盘空间显示异常
问题描述 du 命令显示的磁盘空间与 df 命令显示的不一致。
解决方案
lsof +L1
df -h
du -S -h /home/user
命令执行缓慢
问题描述
解决方案
du -h --max-depth=2 /home/user
find /home/user -type f -name "*.log" -exec du -h {} \;
权限问题导致信息缺失
问题描述
解决方案
sudo du -h /root
ls -ld /root
drwx------ 2 root root 4096 Jan 1 00:00 /root
硬链接重复计算问题
问题描述
解决方案
du -S -h /home/user
du -L -h /home/user
十、总结 du 命令作为 Linux 系统中一个强大而灵活的工具,其在磁盘空间管理中的作用不容小觑。从基础的目录大小查看到复杂的脚本集成,du 命令都能提供可靠的支持。通过本文的详细介绍,我们不仅掌握了 du 命令的基础用法和各种选项,还深入了解了它在脚本中的应用、与其他命令的结合使用、性能考量以及常见问题的解决方法。
du 命令的简洁性和高效性使其成为 Linux 用户和系统管理员的首选工具之一。无论是日常的磁盘监控、故障排查,还是复杂的存储管理任务,du 命令都能以最小的开销提供最大的便利。它的跨平台兼容性也保证了在不同环境下的稳定使用。
在日常的 Linux 使用和系统管理工作中,du 命令无处不在。它不仅是初学者入门 Linux 的第一课,也是资深用户进行复杂任务时的得力助手。从简单的文件大小查看到复杂的容量规划,du 都能以其简洁优雅的方式满足需求。
记住,掌握 du 命令不仅仅是学会如何查看文件和目录的磁盘占用,更是理解和构建 Linux 系统存储管理生态的重要一步。在不断探索和实践中,你会发现 du 命令在各种场景下的无限可能性。它就像一个磁盘空间的侦探,帮助我们在 Linux 世界的旅程中精准定位每一个'磁盘杀手'。
相关免费在线工具 Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
JSON美化和格式化 将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online