Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Unix shell按大小分组文件扩展名_Bash_Shell_Unix_Find - Fatal编程技术网

Bash Unix shell按大小分组文件扩展名

Bash Unix shell按大小分组文件扩展名,bash,shell,unix,find,Bash,Shell,Unix,Find,我想按当前和所有子文件夹中的扩展名对文件大小进行分组和排序 for i in `find . -type f -name '*.*' | sed 's/.*\.//' | sort | uniq ` do echo $i done 获取获取当前和所有子文件夹中所有文件扩展名的代码 for i in `find . -type f -name '*.*' | sed 's/.*\.//' | sort | uniq ` do echo $i done 现在我需要将所有文件的大小按这

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

for i in `find . -type f -name '*.*' | sed 's/.*\.//' | sort | uniq `
do
   echo $i
done
获取获取当前和所有子文件夹中所有文件扩展名的代码

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)

我会使用循环,这样您每次都可以提供不同的扩展名,然后
只查找具有该扩展名的文件:

for extension in c php pl ...
do
   find . -type f -name "*.$extension" -print0 | du --files0-from=- -hc
done
总数是根据表中的答案计算的

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

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

我会使用循环,这样您每次都可以提供不同的扩展名,然后
只查找具有该扩展名的文件:

for extension in c php pl ...
do
   find . -type f -name "*.$extension" -print0 | du --files0-from=- -hc
done
总数是根据表中的答案计算的

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

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

如果您不想预先命名文件扩展名,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]
      }
    }'

如果您不想预先命名文件扩展名,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]
      }
    }'

提到性能,然后提到管道
find
xargs
sed
awk
看起来有点矛盾;性能的许多方面。在shell脚本的上下文中,我通常希望限制调用的进程数量,而xargs是一种很好的方法。因此,我的尝试是获得您命名的四个命令的所有文件扩展名的完整枚举,以及xargs调用stat的次数(取决于系统-每个调用可能在当前系统上处理大约128k的路径名,因此这是一个好处)。但hc总结文件大小信息的速度似乎比awk快…提到性能,然后是管道
find
xargs
sed
awk
看起来有点矛盾;性能的许多方面。在shell脚本的上下文中,我通常希望限制调用的进程数量,而xargs是一种很好的方法。因此,我的尝试是获得您命名的四个命令的所有文件扩展名的完整枚举,以及xargs调用stat的次数(取决于系统-每个调用可能在当前系统上处理大约128k的路径名,因此这是一个好处)。但hc汇总文件大小信息的速度似乎比awk快得多。。。