为什么排序 du -h 不能按预期工作?

为什么排序 du -h 不能按预期工作?

我正在尝试使用人类可读的标志对 du 命令的输出进行排序,并且仅按数值排序结果,忽略扩展名(即 G、M、K ...),而在删除 -h 时标记结果符合预期。

:~/du_exmp$ du -h ./* | sort -n
1.0M    ./file2.txt
2.0G    ./file3.txt
 52K    ./file1.txt
:~/du_exmp$ du  ./* | sort -n
104 ./file1.txt
2048    ./file2.txt
4204192 ./file3.txt

问题的根源是什么?如何解决?

答案1

尝试sort -h。来自手册-h, --human-numeric-sort compare human readable numbers (e.g., 2K 1G)

使用sort --help可以更好地了解命令选项。

答案2

问题是你所看到的是如何sort -n运作的。它只查看一行的初始前导数值(或者更一般地,如果您使用-k字段)并对其进行排序。它根本不理解KMG后缀,所以当它遇到后缀时,它就会停止寻找数字。

最简单的事情就是您在第二个示例中所做的事情:只需在du没有-h标志的情况下使用即可sort完全自然地工作。

如果您确实想保留更易于人类阅读的du -h输出,则必须使用另一个中间管道阶段将解码后的数字添加到 的输出中du,然后对其进行排序,然后可以选择删除排序键,以便输出看起来只是就像那样从du.

另一种选择是使用 plain du,像第二个示例中那样对输出进行排序,并将输出通过管道传输到另一个阶段以对纯整数进行编码du -h

传统上,您会使用awk最后两个想法,但perlorpython也可以。

相关内容