Unix shell组按文件大小扩展文件

时间:2014-10-20 15:05:45

标签: bash shell unix find

我想通过当前和所有子文件夹中的扩展程序对文件大小进行分组和排序

for i in `find . -type f -name '*.*' | sed 's/.*\.//' | sort | uniq `
do
   echo $i
done

获取代码,获取当前和所有子文件夹中的所有文件扩展名

现在我需要按这些扩展名对所有文件大小求和并打印出来 有什么想法可以做到吗?

示例输出:

sh (files sizes sum by sh extension)
pl (files sizes sum by pl extension)
c (files sizes sum by c extension)

2 个答案:

答案 0 :(得分:3)

我会使用一个循环,这样你就可以每次都提供不同的扩展名,find只提供具有该扩展名的文件:

for extension in c php pl ...
do
   find . -type f -name "*.$extension" -print0 | du --files0-from=- -hc
done

总和基于total size of group of files selected with 'find'中的答案。

如果您想要在问题中提到的非常具体的输出,您可以存储最后一行,然后将其与扩展名一起打印:

for extension in c php pl ...
do
    sum=$(find . -type f -name "*.$extension" -print0 | du --files0-from=- -hc | tail -1)
    echo "$extension ($sum)"
done

答案 1 :(得分:1)

如果您不想事先命名文件扩展名, stat(1)程序有一个格式选项(-c),可以使这样的任务更容易,如果你是在包含它的系统上, xargs(1)通常有助于提高性能。

#!/bin/sh

find . -type f -name '*.*' -print0 |
  xargs -0 stat -c '%s %n' |
  sed 's/ .*\./ /' |
  awk '
    {
      sums[$2] += $1
    }
    END {
      for (key in sums) {
        printf "%s %d\n", key, sums[key]
      }
    }'