技术 2020.05.31 52 阅读

用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/