深入理解 Linux du 命令:用法详解与使用示例

时间:2024-11-05 19:13:30

  深入理解 Linux df 命令:用法详解与使用示例
  du 命令是一个非常常用的工具,它用于统计文件和目录的磁盘使用情况。作为 GNU Coreutils 的一部分,du 具备强大的功能,可以递归地计算每个文件或目录的大小,并以各种格式输出。


1. 什么是 `du` 命令?

dudisk usage(磁盘使用量) 的缩写,主要用来显示文件或目录占用的磁盘空间。它会递归地遍历目录,输出每个目录及其子目录的大小。

基本语法

du [选项]... [文件]...

或者:

du [选项]... --files0-from=F
  • [选项]:可选的参数,控制 du 的输出格式和行为。
  • [文件]:要统计的文件或目录。如果不指定文件或目录,du 默认会统计当前目录。

2. `du` 命令的常用选项

du 命令支持许多选项,这些选项可以灵活地控制输出的格式、精度和统计维度。这里主要介绍一些常用以及不常用但有用的选项。

2.1 `-h`:以容易阅读的格式显示

最常用的选项 -h,将大小以更容易理解的格式显示,例如 KB、MB、GB。

du -h /home/example/redis/

输出:

24M	/home/example/redis/data
24M	/home/example/redis/

du 递归遍历当前目录,显示每个子目录的大小, 父目录的大小会包括所有子目录的大小。 -h 选项将大小转换成了更易读的单位,如 KB、MB、GB。

2.2 `-s`:显示总和

如果只关心目录或文件的总大小,可以使用 -s(summarize)选项。它会汇总每个指定目录或文件的大小,而不显示子目录的详细信息。

du -sh /home/example/redis/

输出:

24M	/home/example/redis/

这个命令显示了 /home/example/redis 目录的总大小。

2.3 `-a`:显示所有文件的大小

默认情况下,du 只计算目录的大小,而不会显示每个文件的大小。如果希望显示目录中的每个文件大小,可以使用 -a 选项。

du -ah /home/example/redis/

输出:

4.0K	/home/example/redis/docker-compose.yml
24M	/home/example/redis/data/dump.rdb
24M	/home/example/redis/data
24M	/home/example/redis/

-a 选项会显示目录和文件的大小,而 -h 选项则让输出更易于阅读。

2.4 `--max-depth=N`:限制递归深度

有时不想递归地统计所有子目录的大小,只需要统计当前目录及其直接子目录的大小。这时可以使用 --max-depth 选项来限制递归的深度。

du -ah --max-depth=1  /home/example/redis/

示例输出:

4.0K	/home/example/redis/docker-compose.yml
24M	/home/example/redis/data
24M	/home/example/redis/

--max-depth=1 表示只统计当前目录及其直接子目录的大小,而不再递归到更深的层次。

2.5 `-c`:显示总计

在输出的最后显示一个总计,可以使用 -c 选项。

du -hc --max-depth=1  /home/example/redis/

输出:

24M	/home/example/redis/data
24M	/home/example/redis/
24M	总用量

-c 选项会在输出的最后加上一行,显示所有目录和文件的总和。

2.6 `-b, --bytes`:以字节为单位显示

使用 -b 选项时,du 会以字节为单位显示文件和目录的大小,等效于 --apparent-size --block-size=1

du -b --max-depth=1  /home/example/redis/

输出:

24849411	/home/example/redis/data
24849731	/home/example/redis/

这个命令会以字节为单位显示文件和目录的大小。

2.7 `--apparent-size`:显示表观大小

使用 --apparent-size 可以显示文件的表观大小,即文件名表示的大小,而不是实际占用的磁盘空间。这对于稀疏文件(占用的磁盘空间比文件大小小)特别有用。

du --apparent-size -h  /home/example/redis/docker-compose.yml

这个命令会显示 docker-compose.yml 的表观大小。

  • du -h:显示的是文件在磁盘上的物理大小,即实际分配的存储空间。如果文件是稀疏文件,空白部分不会占用磁盘空间,因此物理大小可能远小于逻辑大小。
  • du --apparent-size -h:显示的是文件的表观大小,即文件的逻辑大小。即使文件中的某些部分未分配物理磁盘空间(如稀疏文件中的空白部分),表观大小仍然会计算这些空白。

2.8 稀疏文件

稀疏文件Sparse File)是一种特殊的文件类型,在很多文件系统中都有支持。稀疏文件的特性在于它允许文件中存在大量的空白(未分配的)空间,而这些空白部分在磁盘上不实际占用物理存储空间。仅在文件中存储了非零数据的部分,而空白部分则以一种高效的方式表示。

这种机制使得稀疏文件在某些应用场景下非常有用,尤其是在需要创建大文件但其中大部分数据为空的场景中,例如数据库、虚拟机磁盘镜像等。

稀疏文件的特性

  • 逻辑大小:稀疏文件的逻辑大小是指文件在存储系统中声明的大小(也就是文件内容大小)。即使文件中有大量空白区域,文件的逻辑大小依然可以非常大。
  • 物理大小:稀疏文件的物理大小是指它在磁盘上实际占用的存储空间。由于空白区域不分配实际磁盘空间,稀疏文件的物理大小往往远小于其逻辑大小。

什么时候物理大小会大于逻辑大小?

在普通文件(非稀疏文件)的情况下,物理大小可能大于或等于逻辑大小,因为文件系统的块大小决定了文件占用的最小磁盘空间。

  • 大多数 Linux 文件系统(如 ext4)的默认块大小为 4 KB,即使文件只包含 1 字节的数据,它也会占用至少 4 KB 的物理磁盘空间。
  • 如果文件的大小不是块大小的整数倍(例如,文件大小为 276 字节),文件系统仍然会为它分配一个完整的块(4 KB),这会导致物理大小大于逻辑大小。

3. `du` 命令的其他选项

3.1 `-0, --null`:以 NUL 结尾

-0 选项会让每行的输出以 NUL 字符(而不是换行符)结束,这在处理包含换行符的文件名时很有用。

du -h -0  /home/example/redis/

输出:

24M	/home/example/redis/data24M	/home/example/redis/

如果文件名中包含特殊字符或换行符,-0 可以避免输出被错误解析。

3.2 `--inodes`:显示 inode 信息

--inodes 选项会显示每个目录或文件的 inode 使用信息,而不是块使用情况。

du --inodes  /home/example/redis/

输出:

2	/home/example/redis/data
4	/home/example/redis/

3.3 `-S, --separate-dirs`:不包括子目录的大小

-S 选项用于统计一个目录的大小,不包括其子目录的大小。 不会将子目录的大小加到父目录中 。

du -S -h /home/example/redis/

3.4 `-t, --threshold=SIZE`:按大小过滤

-t 选项允许根据文件大小进行过滤,排除比某个阈值更小或更大的文件。

du -h --threshold=20M /home/example/redis/

这个命令会只显示 /home/example/redis/目录下大于 20MB 的文件或目录。

3.5 `-X, --exclude-from=FILE`:从文件中读取排除模式

使用 -X 选项可以从指定文件中读取要排除的文件模式,排除符合模式的文件或目录

du -h --exclude-from=patterns.txt /home/example/redis

这个命令会排除 patterns.txt 中指定的模式,并显示 /home/example/redis 的磁盘使用情况。

txt文件示例(排除以txt和yml结尾的文件):

*.txt
*.yml

4. `du` 命令的常见使用场景

4.1 检查磁盘使用情况

当磁盘空间不足时,du 是一个非常有用的工具。可以快速找出哪些目录占用了最多的磁盘空间。

du -sh /*

这个命令会显示每个一级目录的总大小,帮助定位占用空间过大的目录。

4.2 排除无关文件

在统计磁盘使用情况时,某些类型的文件可能并不重要,例如日志文件。可以使用 --exclude 选项来排除这些文件。

du -sh --exclude="*.log" /var/log

这个命令会统计 /var/log 目录的大小,但会排除 .log 文件。

4.3 分析大目录

如果怀疑某个目录占用了过多的磁盘空间,可以使用 du 来分析它的大小,包括每个子目录的大小。

du -h --max-depth=1 /home

这个命令会显示 /home 目录下每个子目录的大小,帮助快速找到占用空间最多的子目录。


希望这篇文章能帮助到你,如果有其他问题或建议,欢迎留言讨论!