磁盘空间总是一种有限资源。我们监视磁盘使用情况,了解何时空间捉襟见肘,然后找到大体积的文件或目录,将其删除、移动或压缩。这则攻略将会讲解磁盘监视相关的命令。
9.2.1 预备知识
du(disk usage)和df(disk free)命令可以报告磁盘使用情况。这两个工具能够统计出文件和目录的磁盘占用情况以及可用的磁盘空间。
9.2.2 实战演练
找出某个文件(或多个文件)占用的磁盘空间:
$ du FILENAME1 FILENAME2 ..
例如:
$ du file.txt
[root@dev workspace]# du input.txt4 input.txt[root@dev workspace]#
要获得某个目录中所有文件的磁盘使用情况,并在每一行中显示各个文件的具体详情,可以使用:
$ du -a DIRECTORY
[root@dev workspace]# du -a ./vitest4 ./vitest/host.txt4 ./vitest/test.sh8 ./vitest/man_db.conf20 ./vitest[root@dev workspace]# lsarchive.tar.gz golang output.txt sample1.txt temp.txt variables.sh welcome.txtecho if.sh out.txt sample2.txt tools vitestelse input.txt printf.sh showArgs.sh umq vitest.tar[root@dev workspace]# du ./vitest20 ./vitest[root@dev workspace]#
选项-a递归地输出指定目录或多个目录中所有文件的统计结果。
执行
du DIRECTORY也可以输出类似的结果,但是它只会显示子目录使用的磁盘空间,而不显示每个文件的占用情况。要想显示各个文件的情况,必须使用-a。
例如:
$ du -a ./vitest4 ./vitest/host.txt4 ./vitest/test.sh8 ./vitest/man_db.conf20 ./vitest
du命令也可以用于目录:
$ du ./vitest20 ./vitest
9.2.3 补充内容
du命令还包括了一些可以定义命令输出形式的选项。
以KB、MB或块(block)为单位显示磁盘使用情况
du命令默认显示文件占用的总字节数,但是以KB、MB或GB为单位显示磁盘使用情况更方便人们阅读。要采用这种更友好的格式进行打印,可以使用选项-h:
$ du -h FILENAME
例如:
$ du -h test/pcpu.sh4.0K test/pcpu.sh#可以接受多个文件参数
或者
# du -h DIRECTORY$ du -h hack/16K hack/
[root@dev workspace]# du -h ./vitest20K ./vitest[root@dev workspace]# du -h input.txt4.0K input.txt[root@dev workspace]#
显示磁盘使用总计
选项-c可以计算出文件或目录所占用的总的磁盘空间,另外还会输出单个文件的大小:
$ du -c FILENAME1 FILENAME2..du -c process_log.sh pcpu.sh4 process_log.sh4 pcpu.sh8 total
或者
$ du -c DIRECTORY$ du -c test/16 test/16 total
或者
$ du -c *.txt#通配符
-c可以同-a、-h等选项配合使用生成常见的输出,另外还会多出一行磁盘使用情况总计。
[root@dev workspace]# du -c input.txt4 input.txt4 total[root@dev workspace]# du -c ./vitest20 ./vitest20 total[root@dev workspace]# du -ch ./vitest20K ./vitest20K total[root@dev workspace]# du -cah ./vitest4.0K ./vitest/host.txt4.0K ./vitest/test.sh8.0K ./vitest/man_db.conf20K ./vitest20K total
另一个选项-s(summarize,总计)则只输出总计数据。它可以配合-h打印出人们易读的格式:
[root@dev workspace]# du -sh ./vitest20K ./vitest[root@dev workspace]# du -sh .327M .[root@dev workspace]# lsarchive.tar.gz golang output.txt sample1.txt temp.txt variables.sh welcome.txtecho if.sh out.txt sample2.txt tools vitestelse input.txt printf.sh showArgs.sh umq vitest.tar[root@dev workspace]#
使用特定的单位打印文件
选项-b、-k和-m可以强制du使用特定的单位打印磁盘使用情况。注意,这些选项不能与-h一同使用:
打印以字节(默认输出)为单位的文件大小:
$ du -b FILE(s)
打印以
KB为单位的文件大小:$ du -k FILE(s)
打印以
MB为单位的文件大小:$ du -m FILE(s)
打印以指定块为单位的文件大小:
$ du -B BLOCK_SIZE FILE(s)
其中,BLOCK_SIZE以字节为单位。
[root@dev workspace]# lsarchive.tar.gz golang output.txt sample1.txt temp.txt variables.sh welcome.txtecho if.sh out.txt sample2.txt tools vitestelse input.txt printf.sh showArgs.sh umq vitest.tar[root@dev workspace]# du -b input.txt20 input.txt[root@dev workspace]# du -k input.txt4 input.txt[root@dev workspace]# du -m input.txt1 input.txt[root@dev workspace]# du -B 512 input.txt8 input.txt[root@dev workspace]#
注意,上述选项返回的文件大小并不直观。如果使用选项-b,du会以字节为单位,返回文件的准确大小。如果使用的是其他选项,du返回的是文件所占的磁盘空间大小。因为磁盘空间是根据固定大小的块(通常是4K)来分配的,因此一个400字节的文件所占用的磁盘空间就是一个块(4K):
$ du pcpu.sh4 pcpu.sh$ du -b pcpu.sh439 pcpu.sh$ du -k pcpu.sh4 pcpu.sh$ du -m pcpu.sh1 pcpu.sh$ du -B 4 pcpu.sh1024 pcpu.sh
- 从磁盘使用统计中排除部分文件
选项--exclude和--exclude-from可以让du在磁盘使用统计中排除部分文件。
- 选项
--exclude可以与通配符或单个文件名配合使用:
例如:$ du --exclude "WILDCARD" DIRECTORY
# 排除所有的.txt文件$ du --exclude "*.txt" *# 排除文件temp.txt$ du --exclude "temp.txt" *
- 选项
--exclude会排除匹配模式的一个或多个文件。选项--exclude-from能够排除多个文件或模式。每个文件名或模式必须独占一行。
选项$ ls *.txt >EXCLUDE.txt$ ls *.odt >>EXCLUDE.txt# EXCLUDE.txt 中包含了需要排除的文件列表$ du --exclude-from EXCLUDE.txt DIRECTORY
--max-depth可以限制du应该遍历多少层子目录。将该选项指定为1,可以统计当前目录的磁盘使用情况。指定为2,可以统计当前目录以及下一级子目录的磁盘使用情况:$ du --max-depth 2 DIRECTORY
选项
-x可以限制du只对单个文件系统进行统计。du默认会跟随符号链接和挂载点。
[root@dev workspace]# du --max-depth 2 . #统计当前目录下一级目录294928 ./tools/git-2.33.1305020 ./tools6860 ./golang/src8200 ./golang/bin13648 ./golang/pkg28712 ./golang20 ./vitest333840 .[root@dev workspace]#
找出指定目录中最大的 10 个文件
du和sort命令能够找出需要被删除或移走的大文件:
$ du -ak SOURCE_DIR | sort -nrk 1 | head
选项-a可以显示出SOURCE_DIR中所有文件和目录的大小。输出的第一列就是文件大小。选项-k表示以KB为单位。第二列包含文件或目录的名称。
sort的选项-n指明按数值排序,选项-l和-r指明对第一列按逆序排序。head用来从输出中提取前10行:
$ du -ak . | sort -nrk 1 | head -n 10333840 .305020 ./tools294928 ./tools/git-2.33.143864 ./tools/git-2.33.1/t30056 ./tools/git-2.33.1/t/helper29764 ./tools/git-2.33.1/libgit.a28712 ./golang22616 ./tools/git-2.33.1/po21612 ./tools/git-2.33.1/git-reflog18208 ./tools/git-2.33.1/builtin
这个单行脚本的缺点之一在于它的结果中还包含了目录。我们可以使用find命令改进脚本,使其只输出最大的文件:
$ find . -type f -exec du -k {} \; | sort -nrk 1 | head -n 1029764 ./tools/git-2.33.1/libgit.a21612 ./tools/git-2.33.1/git-write-tree21612 ./tools/git-2.33.1/git-worktree21612 ./tools/git-2.33.1/git-whatchanged21612 ./tools/git-2.33.1/git-verify-tag21612 ./tools/git-2.33.1/git-verify-pack21612 ./tools/git-2.33.1/git-verify-commit21612 ./tools/git-2.33.1/git-var21612 ./tools/git-2.33.1/git-upload-pack21612 ./tools/git-2.33.1/git-upload-archive
利用find替du将文件过滤出来,这样就无需使用du遍历文件系统了。
注意,
du命令会输出文件的字节数。这个数字未必和文件所占的磁盘空间一样。磁盘空间是以块为单位分配的,因此就算是1字节的文件也会耗费一个磁盘块,块大小通常在512到4096字节之间。
下一节将会讲解使用df命令确定可用的磁盘空间。
磁盘可用空间信息
du提供磁盘使用情况信息,而df提供磁盘可用空间信息。df的-h选项会以易读的格式输出磁盘空间信息。例如:
[root@dev workspace]# df -hFilesystem Size Used Avail Use% Mounted on/dev/sdc 251G 3.7G 235G 2% /tools 147G 112G 36G 76% /initnone 3.9G 0 3.9G 0% /devtmpfs 3.9G 0 3.9G 0% /sys/fs/cgroupnone 3.9G 0 3.9G 0% /runnone 3.9G 0 3.9G 0% /run/locknone 3.9G 0 3.9G 0% /run/shmnone 3.9G 0 3.9G 0% /run/userdrivers 147G 112G 36G 76% /usr/lib/wsl/driverslib 147G 112G 36G 76% /usr/lib/wsl/libnone 3.9G 4.0K 3.9G 1% /mnt/wslnone 3.9G 61M 3.8G 2% /mnt/wslgnone 3.9G 76K 3.9G 1% /mnt/wslg/versions.txtnone 3.9G 76K 3.9G 1% /mnt/wslg/docdrvfsa 147G 112G 36G 76% /mnt/cdrvfsa 330G 125G 205G 38% /mnt/d[root@dev workspace]# df -h .Filesystem Size Used Avail Use% Mounted on/dev/sdc 251G 3.7G 235G 2% /[root@dev workspace]#
df命令也可以使用目录作为参数。在这种情况下,会输出该目录所在分区的可用磁盘空间情况。如果你不知道目录所在分区的话,这种方法就很有用了:
[root@dev workspace]# df -h .Filesystem Size Used Avail Use% Mounted on/dev/sdc 251G 3.7G 235G 2% /
