在 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 是限制查找结果的文件大小阈值。
最佳答案
编辑:
使用 Gnu 实用程序(du
和 sort
):
du -0h | sort -zrh | tr '\0' '\n'
这使用空定界符在 du
和 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
命令的情况下尝试一下,看看它在做什么。
编辑:
这是一个在 AWK 脚本中进行排序且不需要剪切的版本(需要 GNU AWK (gawk
) 以支持 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]]}'
编辑:添加空记录分隔以处理包含换行符的潜在文件名。需要 GNU du
和 gawk
。
关于linux - 人类可读、递归、排序的最大文件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5213288/