在POSIX shell中打印前10个最大文件列表的最佳做法是什么?必须有比我目前的解决方案更优雅的东西:
DIR="."
N=10
LIMIT=512000
find $DIR -type f -size +"${LIMIT}k" -exec du {} \; | sort -nr | head -$N | perl -p -e 's/^\d+\s+//' | xargs -I {} du -h {}
其中LIMIT是文件大小阈值,用于限制查找结果。
答案 0 :(得分:6)
这使用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
说明:
在没有cut
命令的情况下尝试查看它正在做什么。
编辑:
这是一个在AWK脚本中进行排序的版本,不需要剪切(需要GNU AWK(gawk
)来支持asorti
):
du -h |
awk '{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]]}'