Unix 系统中的 du
命令(disk usage 的缩写)是一个用于估算文件和目录磁盘使用空间的强大工具,它通过递归地遍历指定目录下的所有文件和子目录,计算并显示每个项目占用的磁盘空间总量,帮助用户快速定位存储空间的主要消耗者,从而进行有效的磁盘管理。du
命令的灵活性和丰富的选项使其成为系统管理员和开发人员日常工作中不可或缺的工具之一。

du
命令的基本用法
du
命令的基本语法结构为 du [选项] [文件或目录]
,如果不指定任何文件或目录,du
默认会从当前目录开始计算,并显示当前目录下所有子目录和文件的磁盘使用情况,在终端中输入 du
,系统会列出当前目录下每个子目录的大小(以 512 字节块为单位)以及当前目录的总大小,需要注意的是,du
命令默认不会显示目录本身的磁盘使用情况,而是显示其包含内容的总和。
常用选项详解
du
命令提供了大量选项,以满足不同的显示和管理需求,以下是一些最常用且重要的选项:
-
-h
或--human-readable
:以人类可读的格式显示文件大小,这是最常用的选项之一,它会自动选择合适的单位(如 KB、MB、GB、TB)来显示文件大小,而不是默认的 512 字节块。du -h
会显示类似0K ./test.txt
这样的输出,0K
表示文件大小为 4 千字节。 -
-s
或--summarize
:仅显示总计值,当需要快速了解某个目录的总磁盘使用量时,此选项非常有用。du -sh /home/user
会直接显示/home/user
目录及其所有子目录的总大小,而不会列出每个子目录的详细信息。(图片来源网络,侵删) -
-a
或--all
:显示所有文件的大小,默认情况下,du
只显示目录的大小,使用-a
选项后,它会同时显示目录和文件的大小,这对于查找占用空间的大文件非常有帮助。 -
--max-depth=N
:限制递归的深度,此选项可以控制du
命令向下遍历目录的层级数。du --max-depth=1 /var
会显示/var
目录下一级子目录的大小,而不会深入到更深层级的目录中,这有助于快速了解目录结构的主要空间分布。 -
--exclude=PATTERN
:排除匹配模式的文件或目录,在进行磁盘空间分析时,有时需要排除某些特定文件(如临时文件、日志文件等)。du -sh --exclude="*.log" /var/log
会计算/var/log
目录的总大小,但排除所有以.log
结尾的文件。 -
--time
:显示最后修改时间,此选项会在输出中包含每个文件或目录的最后修改时间戳,这对于结合文件管理进行归档或清理非常有用。du --time -h /backup
会显示备份目录中每个项目的大小和最后修改时间。(图片来源网络,侵删) -
-c
或--total
:显示总计值,与-s
类似,-c
会在输出所有文件和目录的大小后,额外显示一个总计行。du -hc *.txt
会计算当前目录下所有.txt
文件的大小,并显示它们的总和。 -
-k
:以 KB 为单位显示大小,此选项强制du
以 1024 字节(即 1KB)为单位显示文件大小,而不是默认的 512 字节块。
实际应用场景
du
命令在实际工作中有着广泛的应用场景,以下是一些典型的使用案例:
-
查找大文件和目录:当磁盘空间不足时,可以使用
du
命令快速定位占用空间最大的文件或目录。du -sh /* | sort -hr | head -10
会列出根目录下最大的 10 个目录或文件,并按大小降序排列,这有助于用户优先清理不需要的大文件。 -
监控特定目录的磁盘使用情况:对于需要定期监控的目录(如
/var/log
、/home
),可以结合du
和cron
任务设置定期报告,可以创建一个脚本,每天运行du -sh /home/user > disk_usage.log
,并将结果记录到日志文件中,以便跟踪磁盘使用趋势。 -
清理临时文件:在开发或日常使用中,系统会产生大量临时文件,使用
du
命令可以快速识别这些文件的位置和大小,从而进行清理。du -sh /tmp
可以查看临时目录的总大小,而du -ah /tmp | sort -hr | head -5
可以找到/tmp
目录中最大的 5 个文件。 -
磁盘容量规划:在进行系统部署或扩容时,可以使用
du
命令分析现有目录的磁盘使用情况,为新的存储分配提供依据。du -sh /data
可以帮助管理员了解数据目录的当前使用量,从而决定是否需要增加存储空间。
高级技巧与注意事项
-
结合管道和排序:
du
命令的输出经常需要通过管道传递给其他命令进行进一步处理。sort
命令可以用于对输出结果进行排序,head
或tail
命令可以用于查看最大的或最小的几个项目,如前所述,du -sh /* | sort -hr | head -10
是一个非常实用的组合命令。 -
注意符号链接的处理:默认情况下,
du
命令会跟随符号链接,即计算符号链接指向的实际文件或目录的大小,如果需要避免跟随符号链接,可以使用-l
选项,这在处理包含多个符号链接的目录时非常重要,以避免重复计算。 -
文件系统边界:
du
命令的计算范围仅限于同一个文件系统,如果目录跨越了多个文件系统(如挂载点),du
默认不会计算其他文件系统中的文件大小,如果需要跨文件系统计算,可以使用-x
选项(或--one-file-system
),确保只计算当前文件系统中的文件。 -
性能考虑:对于包含大量文件和子目录的文件系统,
du
命令的执行可能会比较耗时,因为它需要递归遍历所有文件,在这种情况下,使用--max-depth
限制深度或使用-s
仅获取总计值可以显著提高命令的执行效率。
常见命令示例
以下是一些 du
命令的常见示例及其解释:
命令 | 解释 |
---|---|
du |
显示当前目录下所有子目录和文件的磁盘使用情况(以 512 字节块为单位)。 |
du -h |
以人类可读的格式(KB、MB、GB)显示当前目录的磁盘使用情况。 |
du -sh /var/log |
显示 /var/log 目录的总磁盘使用量,并以人类可读的格式呈现。 |
du -ah /home |
显示 /home 目录下所有文件和子目录的大小,包括文件本身。 |
du --max-depth=1 /usr |
显示 /usr 目录下一级子目录的大小,不深入更深层级。 |
du -h --exclude="*.tmp" /tmp |
显示 /tmp 目录的大小,但排除所有以 .tmp 结尾的文件。 |
du -ch *.txt | grep total |
计算当前目录下所有 .txt 文件的总大小,并显示总计值。 |
du -sh /mnt/nfs | du -sh /local |
比较两个不同挂载点的磁盘使用情况。 |
相关问答 FAQs
问题 1:du
命令和 df
命令有什么区别?
du
和 df
都是用于查看磁盘空间的命令,但它们的功能和用途不同。du
命令用于估算文件和目录占用的磁盘空间,它是从文件系统的角度逐个计算文件和目录的大小,因此显示的是已用空间的实际使用情况,而 df
命令用于显示文件系统的整体磁盘使用情况,包括总容量、已用空间、可用空间以及挂载点等信息。df
是从文件系统的块分配角度统计的,显示的是文件系统级别的空间分配,而不是单个文件或目录的大小。du
关注的是“哪些文件占用了空间”,而 df
关注的是“文件系统的空间还剩多少”。
问题 2:如何使用 du
命令快速找到当前目录中最大的 5 个文件或目录?
可以使用 du
命令结合 sort
和 head
命令来实现,具体步骤如下:
- 使用
du -ah
命令以人类可读的格式显示当前目录下所有文件和子目录的大小。 - 使用
sort -hr
对输出结果进行降序排序(-h
表示按人类可读的数字大小排序,-r
表示降序)。 - 使用
head -5
显示排序后的前 5 行结果。
完整的命令为:du -ah | sort -hr | head -5
,这个组合命令会列出当前目录中占用空间最大的 5 个文件或目录。