人类可读,递归,排序的最大文件列表

时间:2011-03-06 20:45:34

标签: linux shell unix 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 {}

其中LIMIT是文件大小阈值,用于限制查找结果。

1 个答案:

答案 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

说明:

  • BEGIN - 创建一个索引的字符串,用1,2,3代替K,M,G进行单位分组,如果没有单位(大小小于1K),那么就没有匹配,返回零(完美!)
  • 打印新字段 - 单位,值(使alpha排序正常工作,它是零填充,固定长度)和原始行
  • 索引大小字段的最后一个字符
  • 拉出大小的数字部分
  • 对结果进行排序,丢弃额外的列

在没有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]]}'