Unix shell 组文件扩展名(按大小)

Posted

技术标签:

【中文标题】Unix shell 组文件扩展名(按大小)【英文标题】:Unix shell group files extensions by size 【发布时间】:2014-10-20 15:05:45 【问题描述】:

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

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)

【问题讨论】:

【参考方案1】:

我会使用循环,以便您每次都可以提供不同的扩展名,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

【讨论】:

【参考方案2】:

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

【讨论】:

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

以上是关于Unix shell 组文件扩展名(按大小)的主要内容,如果未能解决你的问题,请参考以下文章

Unix/Linux系统管理技术手册学习笔记——shell

在UNIX shell编程里如何比较两个文件哪个修改的时间晚些!急谢谢!

unix shell 如何拆分文件

shell的split生成的文件按规律命名及添加扩展名

linux,unix,windows三大操作系统的区别在哪

sh 将文件系统扩展为调整大小的卷