用sort -h优雅解决du带单位数值排序问题
本文记录了作者在 Linux 服务器上排查磁盘空间时的探索过程
· · ·今天下午,我想查看下运行本博客的服务器还剩多少硬盘空间。这对于 Linux、Unix 命令来说,是很常规的事情。在我得到所需信息之后,我开始思考其他方式去实现。这种思考常常让我学到新知识。当然,这里所说的“新”是对我而言的。
首先,我登录到服务器,然后运行 df 命令:
df -h .
会输出包含特定文件的文件系统硬盘使用量概况(本例中,当前目录( .)是我的 home 目录)
这是输出结果:
Filesystem Size Used Avail Use% Mounted on /dev/disk/by-label/DOROOT 25G 9.5G 14G 41% /
输出结果表明,我购买的 25GB 空间中已经使用了41% 。-h 参数让 df 命令将结果输出为便于人类理解的格式(即以 KB、MB、GB 为单位),而非以“1-K blocks”格式。很多 GNU 程序都可以用-h 参数来实现这种输出格式。
这里的硬盘使用量,包含了我虚拟主机上的所有文件——所有的可执行文件、库文件以及博客文件之外的支持该文件。为了只查看博客文件占用情况,我需要改善输出结果。还是要用到 du 命令:
du -hd 1 .
跟前面一样,-h 参数表示便于人类理解的格式的数值。-d 1 参数让 du 只统计第 1 层深度的文件夹。输出为:
8.0K ./.gnupg 68K ./pagelogs 114M ./all-this 9.0M ./.local 116K ./php-markdown 1.5M ./.cache 68K ./.ipython 20K ./.pip 8.0K ./.ssh 522M ./tmp 16K ./bin 8.0K ./.conda 1.1G ./public_html 4.0K ./.nano 3.4G ./anaconda3 5.1G .
public_html 那行,就是我想要得到的:1.1 GB。对于整个服务器的硬盘空间而言,博客占用的很小。
当我看到 du 的输出结果时,我觉得,如果能让它按数字大小排序会更有用。我想过给 du 加上-s 参数,但没效果。du 的参考手册里并没有用于排序的参数。
对于排序问题,UNIX 常规做法是使用管道(pipe),但是我确定这种做法不行。因为虽然 sort 有 -n 参数可以用于按数值大小排序,但是 du 输出结果中的数值,没法用于正确排序(译者注:因为前面 du 输出的是便于人类理解的格式,也就是带K、M、G等单位的数值,并不是纯数值,没法直接用单位前的数值排序)。我想排序的是带单位的数值,必须要考虑数值后面的单位。不妨来试一下:
du -hd 1 . | sort -n 输出如下: 1.1G ./public_html 1.5M ./.cache 3.4G ./anaconda3 4.0K ./.nano 5.1G . 8.0K ./.conda 8.0K ./.gnupg 8.0K ./.ssh 9.0M ./.local 16K ./bin 20K ./.pip 68K ./.ipython 68K ./pagelogs 114M ./all-this 116K ./php-markdown 522M ./tmp
这个输出结果,正如我所料,sort -n 虽然能够完美的排序纯数值,但带单位的数值没用。
我试着使用 du 其他输出方法
du -kd 1 . | sort -n -k 让 du 将文件大小输出为以 KB 为单位的数值,排序之后的输出为: 4 ./.nano 8 ./.conda 8 ./.gnupg 8 ./.ssh 16 ./bin 20 ./.pip 68 ./.ipython 68 ./pagelogs 116 ./php-markdown 1448 ./.cache 9184 ./.local 115896 ./all-this 534104 ./tmp 1098316 ./public_html 3470796 ./anaconda3 5333936 .
输出结果很不错,不过有些数值有5、6个数这么长,这让人很难快速理解它的大小。
不过,下面就到了让我学到新知识的地方了。下面的结果表明,GUN 注意到了对于读写便于人类理解的数值的需求,为此它为 sort 添加了 -h 参数。那么,以下命令:
du -hd 1 . | sort -hr 输出结果是: 5.1G . 3.4G ./anaconda3 1.1G ./public_html 522M ./tmp 114M ./all-this 9.0M ./.local 1.5M ./.cache 116K ./php-markdown 68K ./pagelogs 68K ./.ipython 20K ./.pip 16K ./bin 8.0K ./.ssh 8.0K ./.gnupg 8.0K ./.conda 4.0K ./.nano
这才是我想要的!不仅方便理解,而且排序准确。( -r 参数是让 sort 倒序排列,也就是说从大到小)
-h 参数是在2009年才添加到 GNU 的 sort 里。
是我重新用回 Mac 开始,不再像以前那样极度依赖命令行之后的四五年的事情了。所以,不知道这个参数,我也不感到太意外。
原文链接:https://leancrew.com/all-this/2020/05/sort-of-handy/