深入理解 Linux df 命令:用法详解与使用示例
du
命令是一个非常常用的工具,它用于统计文件和目录的磁盘使用情况。作为 GNU Coreutils 的一部分,du
具备强大的功能,可以递归地计算每个文件或目录的大小,并以各种格式输出。
1. 什么是 `du` 命令?
du
是 disk 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
目录下每个子目录的大小,帮助快速找到占用空间最多的子目录。
希望这篇文章能帮助到你,如果有其他问题或建议,欢迎留言讨论!