1.鸟瞰全局
当我们试图从宏观的视角鸟瞰磁盘的空间的总体使用状况时,应该使用 df(disk usage) 命令。
$ df -h |sort -h -k 2
从最后一行
'/dev/mapper/vgkubuntu-root 110G 95G 9.7G 91% /'
可知,我的硬盘空间只剩下 9.7G 可用(Available)。这也是将disk free的本义,即disk-free=Size-Used
2.局部具体分析
审视当前Home目录下各个文件的磁盘占用状态,应用 du 命令。人如其名,du 是硬盘使用(Disk Usage)的缩写。
$ du -sh * |sort -hr |nl
上例中的 -s 是 --summarize 简写形式,读取指定参数总的硬盘占用空间;-h 为 --human-readable 即以人类可读的形式显示(如 1K 234M 2G)。
命令运行之后,各文件与目录的磁盘占用状态一目了然地展示出来,其中最大的是 Videos 目录,足足有40G,而我可用的硬盘空间只剩下区区9.7G,似乎应该马上采取行动,将其转移到其他存储设备上。
3.报告隐藏文件的信息
上面的结果给出了有价值的参考。然而再一观察则发现,隐藏的目录没有统计进来。这与星号*这个wildcard(通配符) 的默认设置有关,因为只显示非隐藏的目录与文件。
我们可以调用 shopt 命令修改其默认属性:
$ shopt -s dotglob
重新运行上述命令:
$ du -sh * |sort -hr |nl |tail -n 20
可以看到隐藏的目录也显示出来。得到结果之后,将刚才修改的属性恢复到默认。
$ shopt -u dotglob # unset 关闭$ shopt dotglob # 查看是否已经关闭dotglob off
这个例子修改了系统的默认属性,乃是迂回的解决方案。我们最好还是求诸于 du 命令本身,找到直接的方法。
Linux通配符的深入分析,请查阅 《透彻分析Linux的通配符》
4.指定目录的深度
du 是个递归命令,默认情形下,它会向下无限层级的搜索和读取信息。
$ du -h | head -n 20
而我们若要只参阅 Home 的一级目录的磁盘占用情况,需要指定目录的深度。
$ du -h --max-depth=1 ~ |sort -hr |nl
从结果中,我们看到了隐藏目录的大小,距离目标又更进了一步。
5.显示所有文件和目录
指定目录的深度之后,隐藏目录显示出来。但是 du 命令默认只从总体上统计目录的磁盘占用,并不单独输出文本文件的大小。
我们可以通过 find 命令获悉,Home目录下合计有40个文件。
$ find ~ -maxdepth 1 -type f |nl
(find命令的详尽分析请参阅:《万物皆为可循可查,诸事直如掌中手中》)
然而,以上的40个文件,从 du 命令输出的结果中是看不到的。比如我们从其中查找 start.sh 这个文件。
先用 ls 命令核实:
$ ls -l start.sh-rwxr-xr-x 1 spiritme spiritme 1793 May 7 06:20 start.sh
但是从 du 命令中看不到 start.sh 文件
$ du -h --max-depth=1 ~ |grep start.sh# 无结果返回
鉴于此,我们必须显式的调用 -a 选项。
-a, --all write counts for all files, not just directories
添加 -a 选项后,运行
$ du -h -a --max-depth=1 ~ |grep start.sh4.0K /home/spiritme/start.sh
此时,start.sh 总算露脸现身了。完整的输出结果如下:
$ du -h -a --max-depth=1 ~ |sort -hr |nl
统计Home目录下有文件和文件夹合计94项,其中案例4中的结果有52个目录(directories),本案例 find 命令找到 40 个文件,另外还有两个是系统默认的目录(.和..),三者之和正好为94。
6.解索引软连接
我们观察案例5中输出结果的最后一行
$ du -h -a --max-depth=1 ~ |sort -hr |nl.... 94 0 /home/spiritme/.doom.d
文件 .doom.d 的大小为 0。
检查此文件:
$ ls -l .doom.dlrwxrwxrwx 1 spiritme spiritme 37 Jan 31 15:02 .doom.d -> /home/spiritme/Documents/primary.doom.d
发现它是指向目录'/home/spiritme/Documents/primary.doom.d'的软连接,文件大小只有37个字节。
我们从 ls 命令中将其解索引,查看其指向目录所占用的磁盘空间:
$ ls -laLh |grep doom.ddrwxrwxr-x 8 spiritme spiritme 4.0K May 15 15:43 .doom.d
其中 -L 选项为‘解索引’(--dereference)。
-L, --dereferencewhen showing file information for a symbolic link, show information for the file the link references rather than for the link itself.
同样的逻辑,du 命令也有 dereference 的选项。
-L, --dereference dereference all symbolic links
综合以上案例,我们运行一次完整的命令:
$ du -h -a -L --max-depth=1 ~ |sort -hr |nl
从打印的结果中,我们看到了 .doom.d 这个隐藏的软连接文件所指向的目录的实际大小为 190M。
7.按照文件大小筛选
通过以上六步,我们对计算机磁盘的全局和局部做到了心中有数。接下来,探索一番如何按照文件大小进行筛选。
比如查看Home目录下所有容量大于1G的目录与文件,可以将 du 与 grep 协同使用:
$ du -h -a ~ |sort -hr | grep -e ^[0-9.]*G -e ^[0-9]*M |nl 1 76G /home/spiritme... 44 1.2G /home/spiritme/Videos/BibleProject/01.How-to-Read-Bible 45 1.1G /home/spiritme/Videos/BibleProject/08.OldTestament/old-testament-1/exodus-part2-images
得到了45个结果。
同理,我们也可以查看所有大于1M的文件与目录:
$ du -h -a ~ |sort -hr | grep -e ^[0-9.]*G -e ^[0-9.]*M |nl |tail... 8227 1.0M /home/spiritme/anaconda3/pkgs/cffi-1.12.3-py37h2e261b9_0 8228 1.0M /home/spiritme/anaconda3/pkgs/astropy-4.0.1.post1-py37h7b6447c_0/lib/python3.7/site-packages/astropy/visualization 8229 1.0M /home/spiritme/anaconda3/lib/python3.7/site-packages/pygal
输出了8229个结果。
我们甚至还能查看大于1G的目录的树状图结构
(Tree命令的详尽分析请参与 《透彻分析Linux的tree命令》
以上方法只能查看大于1G或者大于1M的文件,当我们需要查看大于95M的文件呢?
du 命令贴心的准备了'最低门槛‘(threshold) 选项。
-t, --threshold=SIZE exclude entries smaller than SIZE if positive, or entries greater than SIZE if negative
添加此参数运行后输出293个结果:
du -ahL --threshold=95M ~ |sort -hr | nl 176G/home/spiritme 240G/home/spiritme/Videos 320G/home/spiritme/Videos/BibleProject ... 29396M/home/spiritme/Public/nikola-post/output
倘若查看所有小于95M的文件,只需在数字95前面添加负号。
$ du -ahL --threshold=-95M ~ |sort -hr | nl |tail...396752 0 /home/spiritme/anaconda3/lib/python3.7/site-packages/loguru/py.typed396753 0 /home/spiritme/anaconda3/lib/python3.7/site-packages/alembic/runtime/__init__.py396754 0 /home/spiritme/anaconda3/envs/.conda_envs_dir_test
输出了396754个文件。
由此,我们获得了一个启发,当按照文件大小进行筛选之时,除了可以应用早先文章中介绍的 ’find -size' 方法之外,也可以从 du 的视角查看。这两个命令的逻辑是完全一致的。
find 命令版本如下:
8.图形界面
最后,除了命令行的方法,我们还有GUI图形界面的途径可供选择。
安装baobab,
sudo apt install baobak
运行之后就能看到一个漂亮的可视化界面
9.关联性工具
其他查看磁盘空间的命令行工具还有 lsblk 和 fdisk
运行 lsblk 命令:
$ lsblk | sort -k 4 -h
运行 fdisk 命令
$ sudo fdisk -l
10.收尾总结
本文中,我们先从 df(disk free) 命令出发,鸟瞰磁盘空间的全局。接着下降到局部视角,用 du(disk usage) 命令,因循持续改进的逻辑,逐步解决审查当前Home目录各个文件磁盘占用状态的问题。相关命令与参数总结如下:
作为收尾,回到最初的问题,在Home目录下,可以应用简单的解决方案:
du -sh *
当要检视一级目录下所有的文件时,使用命令:
du --max-depth=1 -all --human-readable --dereference ~ # 简写为du -d 1 -a -h -L# 或者du -ahL -d 1
换言之,要么最简单的命令 `du -sh *`,要么使用复杂的组合` du -ahL -d 1`。
以上完结,盼对你有点滴启发与帮助。
本文中涉及的其他两个命令 find 和 tree的文章如下:
《透彻分析Linux的通配符》
《透彻分析Linux的tree命令》
《透彻分析Linux的find命令》