我正在尝试使用人类可读的标志对 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
最后两个想法,但perl
orpython
也可以。