linux - 人类可读、递归、排序的最大文件列表

标签 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 是限制查找结果的文件大小阈值。

最佳答案

编辑:

使用 Gnu 实用程序(dusort):

du -0h | sort -zrh | tr '\0' '\n'

这使用空定界符在 dusort 之间传递信息,并使用 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 dugawk

关于linux - 人类可读、递归、排序的最大文件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5213288/

相关文章:

linux - 如何从 Linux shell 访问 BIOS ROM 二进制文件

linux - "$?"在 shell 脚本中究竟给了我们什么?

linux - Chef-Server安装找不到chef服务

c - 利用 jmp_buf 结构中的缓冲区溢出

c - Unix(FreeBSD) - 如何获取每秒的真实时钟

shell - 如何注释掉 shell 脚本中的特定行

linux - 如果目录存在,Unix Bash Shell 编程

node.js - Node 应用程序的重定向端口

linux - screenrc 中的 shell 命令

Python pexpect 没有按预期工作