Edit:
使用 Gnu 实用程序(du
and sort
):
du -0h | sort -zrh | tr '\0' '\n'
这使用空分隔符在之间传递信息du
and sort
和用途tr
将空值转换为换行符。空值允许该管道处理可能包含换行符的文件名。两个都-h
选项使输出成为人类可读的形式。
原来的:
这使用awk
为排序键创建额外的列。它只调用du
一次。输出应该看起来完全像du
.
我已将其分成多行,但可以将其重新组合成一行。
du -h |
awk '{printf "%s %08.2f\t%s\n",
index("KMG", substr($1, length($1))),
substr($1, 0, length($1)-1), $0}' |
sort -r | cut -f2,3
解释:
- BEGIN - 创建一个字符串来索引,用 1、2、3 代替 K、M、G 按单位分组,如果没有单位(大小小于 1K),则不匹配并返回零(完美! )
- 打印新字段 - 单位、值(为了使 alpha 排序正常工作,它是零填充的、固定长度)和原始行
- 索引大小字段的最后一个字符
- 拉出尺寸的数字部分
- 对结果进行排序,丢弃多余的列
尝试一下,无需cut
命令来查看它在做什么。
Edit:
这是一个在 AWK 脚本内进行排序并且不需要剪切的版本(需要 GNU AWK (gawk
) for asorti
支持):
du -h0 |
gawk 'BEGIN {RS = "\0"}
{idx = sprintf("%s %08.2f %s",
index("KMG", substr($1, length($1))),
substr($1, 0, length($1)-1), $0);
lines[idx] = $0}
END {c = asorti(lines, sorted);
for (i = c; i >= 1; i--)
print lines[sorted[i]]}'
编辑:添加了空记录分隔以处理包含换行符的潜在文件名。需要 GNUdu
and gawk
.