1. 絮絮叨叨
- 工作中,经常需要与磁盘打交道
- 写入大文件前,需要查看磁盘的剩余容量,避免磁盘被写满、影响系统的正常运行
- 在磁盘存储告警(磁盘写满)时,需要判断哪个目录存在大文件,或者哪个目录可以删除一部分文件,从而释放存储资源
- 之前都是浑浑噩噩的,要么按照感觉使用linux命令,要么上网搜索
- 大概知道,主要使用
df
和du
这两个命令 - 最近的工作中,频繁地搜索使用方法,让自己想要系统地学习一下
df
和du
这两个命令
2. df
命令
- 使用
df --help
,可以查看df
命令的帮助信息。 - 帮助信息是这样介绍
df
命令的:Show information about the file system on which each FILE resides, or all file systems by default.
- 从上述介绍可知,
df
命令可以看做是disk FileSystem
的缩写,用于展示文件系统的信息 - 也有博客说(df command in Linux with Examples),
df
是disk free
的缩写,用于展示文件系统总空间、可用空间等信息The df command (short for disk free), is used to display information related to file systems about total space and available space.
- 自己更喜欢第二种说法,因为自己使用
df
命令,就是为了查看磁盘空间的使用情况
2.1 基本使用
2.1.1 指定展示的单位(size)
-
最简单的使用方法:
df
,默认以K
为单位,展示已挂载的文件系统的磁盘使用情况:
-
通过
-B
指定单位,从而以1024或者1000的进制展示磁盘使用情况SIZE is an integer and optional unit (example: 10M is 1010241024). Units are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, … (powers of 1000).
-
例如,以
G
(1024进制)为单位展示磁盘使用情况df -B G # 相同的效果 df -BG
-
展示效果如下:
2.1.2 使用-h
增强可读性
- 就算将单位指定为
G
,还是有部分文件系统的磁盘使用情况可读性较弱,如上面截图中/dev/sdg1
- 我们更希望将磁盘大小,按照合适的单位进行展示,这样展示出来的磁盘使用情况,可读性更强
- 使用
-h
选项,可以满足该需求
2.1.3 -H
使用1000进制
-
使用
-h
以合适的单位展示磁盘使用情况时,进制为1024,可以使用-H
指定1000的进制df -hH
-
效果如下:
-
注意:
-h
和-H
,都不是--help
的缩写
2.2 文件系统的类型
-
df
命令还可以展示文件系统的类型(type),可以通过大写的-T
选项让其展示文件系统的类型
-
有时,我们希望查看指定类型的文件系统 —— 可以通过小写的
-t
选项实现df -hT -t xfs
-
最终,将只展示
xfs
类型的文件系统
-
有时,我们希望展示除某种类型外的、其他类型的文件系统 —— 可以通过
-x
选项实现df -hT -x xfs
-
最终,将展示非
xfs
类型的文件系统
2.3 最佳实践:确认文件/目录可以使用的磁盘空间
-
学到了这里,貌似
df
命令没啥用 😂 -
实际工作中,经常会遇到类似的情况:想往目录
/bigdata/benchmark
写入一个100GB的文件,对应的磁盘是否有足够的空间呢? -
这时,
df
命令非最佳实践就出现了:通过指定目录,知道对应磁盘的可用空间,从而避免磁盘写满、影响系统或程序的正常运行df -h /bigdata/benchmark
-
从执行结果可以看出,完全可以向
/bigdata/benchmark
目录写入一个100GB的文件
2.4 参考链接
- 通过学习,发现
df
命令实际比较简单,而本人最常使用的就是df -h
或df -h /dir
了 - 感谢以下参考链接:
3. du
命令
- 通过
du --help
查看du
命令的帮助信息,对该命令的描述如下:Summarize disk usage of each FILE, recursively for directories.
- 翻译一下:统计每个文件的磁盘使用情况,对于目录会进行递归计算
- 即
du
可以看做是disk usage
的缩写,会统计目录下的文件、子目录所占用的磁盘大小,也就是会统计该目录大小
3.1 基本使用
3.1 指定单位
-
使用
du
统计文件(目录)大小时,需要指定文件。du /bigdata/benchmark/
-
递归展示
/bigdata/benchmark/
目录下,各子目录以及自身的大小
-
若不指定文件,则统计当前目录
./
的文件大小
-
同
df
一样,可以通过-B
选项指定单位,从而方便阅读
-
除此之外,
du
命令还允许通过-b
、-k
、-m
直接指定单位
3.1.2 -h
增加可读性
- 为了方便阅读,可以使用
h
选项以合适的单位进行展示
3.2 展示文件大小
-
上面的执行结果,只展示了指定目录及其子目录的大小。然而,在排查大文件时,我们还想知道目录下的文件大小
-
这时,可以使用
-a
选项,同时统计文件和目录的大小du -ah /bigdata/presto-cli/
-
最终,
/bigdata/presto-cli/
目录下各文件的大小也将会统计
3.3 如何避免过多的统计信息
3.3.1 -s
选项:只展示指定目录的大小
-
使用
du
统计目录大小时,会发现如果该目录存在很多的子目录,展示的结果就跟cat一个文件的内容一样:一下子打印太多,反而干扰了关键信息的展示 -
有时,我们只想知道当前目录的大小,不用统计其子目录的大小
-
这时,可以使用
-s
选项,只展示该目录的大小du -sh /bigdata/presto-cli/
3.3.2 -d
选项:只展示指定层级的目录大小
-
很多时候,目录的层级很深,通过
du
命令查看目录大小时,不需要知道底层子目录的大小,只需要知道最上面几层子目录的大小 -
以
/bigdata/compile
目录为例,其子目录的层级非常深
-
如果直接使用
du -h /bigdata/compile
查看目录大小,最后打印的信息会把眼睛都给闪瞎 😂 -
这时,可以使用
-d
选项限制目录层级,-d
选项是--max-depth
的缩写 -
例如,下面就是使用
-d
选项,只统计第一层子目录的大小du -h -d 1 /bigdata/compile/
-
也可以直接使用
--max-depth
,效果一样du -h --max-depth=1 /bigdata/compile/
-
一般的话,如果是排查目录下的大文件,我会这样使用
du
命令:- 既统计子目录大小,又统计文件大小;
- 只查看第一层子目录的情况,确定子目录后,不断更新
/dir
从而层层逼近大文件所在的目录
du -ah --max-depth=1 /dir
3.4 其他
-
除此之外,还有一些本人不常使用的选项
-
--time
,获取目录下文件或子目录的最近修改时间 —— 跟-d
选项结合,能更好地判断哪个目录存在大文件,大文件是否仍在写入等
-
--exclude=PATTERN
选项,忽略满足正则表达式的文件
- 参考链接:
4. 总结
df
命令:disk free
的缩写,可以用于查看某个目录所在磁盘的剩余空间,避免大量文件写入该目录,导致磁盘爆满du
命令:disk usage
的缩写,可以用于统计目录大小,在发现目录中的大文件十分有用