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

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是文件大小阈值,用于限制查找结果.

Pau*_*ce. 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
Run Code Online (Sandbox Code Playgroud)

说明:

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

没有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)