Mat*_*tti 6 unix linux shell posix
在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 {}
Run Code Online (Sandbox Code Playgroud)
其中LIMIT是文件大小阈值,用于限制查找结果.
这用于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
Run Code Online (Sandbox Code Playgroud)
说明:
没有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]]}'
Run Code Online (Sandbox Code Playgroud)