如何查找按扩展名分组的总文件大小


12

我在与其他同事共享的集群上工作。硬盘是有限的(在某些情况下已经装满),因此我偶尔会清理部分。我想快速执行此操作,因此直到现在,我都将大于100 MB的文件列表设置为3个月以上,以查看是否仍然需要它们。

但是现在我正在考虑可能存在一个文件夹,其中缺少> 1000个较小的文件,因此我想以一种简单的方法来查看是否是这种情况。从生成数据的方式来看,这将有助于获取每个扩展的总大小列表。在此问题的上下文中,“扩展名”是文件名中最后一个点后面的所有内容。

假设我有多个包含多个文件的文件夹:

folder1/file1.bmp   40 kiB
folder1/file2.jpg   20 kiB
folder2/file3.bmp   30 kiB
folder2/file4.jpg    8 kiB

是否可以列出每个文件扩展名的总文件大小列表,如下所示:

bmp 70 kiB
jpg 28 kiB

我不在乎没有扩展名的文件,因此可以忽略它们或将它们放在一个类别中。

我已经通过手册页去ls,du和find,但我不知道究竟是什么工作的工具...


这个问题在codegolf.stackexchange.com上不会存在:)
— Doug McLean

@DougMcLean:欢迎您在此处发布。;)

Answers:


16

在GNU系统上:

find . -name '?*.*' -type f -printf '%b.%f\0' |
  awk -F . -v RS='\0' '
    {s[$NF] += $1; n[$NF]++}
    END {for (e in s) printf "%15d %4d %s\n", s[e]*512, n[e], e}' |
  sort -n

或与相同perl,避免-printf扩展GNU find(仍然使用GNU扩展-print0,但如今已得到广泛支持):

find . -name '?*.*' -type f -print0 |
  perl -0ne '
    if (@s = stat$_){
      ($ext = $_) =~ s/.*\.//s;
      $s{$ext} += $s[12];
      $n{$ext}++;
    }
    END {
      for (sort{$s{$a} <=> $s{$b}} keys %s) {
        printf "%15d %4d %s\n",  $s{$_}<<9, $n{$_}, $_;
      }
    }'

它给出如下输出:

          12288    1 pnm
          16384    4 gif
         204800    2 ico
        1040384   17 jpg
        2752512   83 png

如果需要KiB,MiB...后缀,请连接到numfmt --to=iec-i --suffix=B。

%b*512给出了磁盘使用情况,但是请注意,如果文件多次硬链接,它们将被计数几次,因此您可能会发现与du报告内容有所出入。


在MacOS上失败(查找:-printf:主或未知操作员)
— MichaelCodes

1
@MichaelCodes,是的,它-printf特定于GNU find,这就是我在GNU系统上说的原因。
— 斯特凡Chazelas

@MichaelCodes,请参阅编辑,该perl替代方法即使在macOS上也应适用。
— 斯特凡Chazelas

1,4,2,17是什么?每种类型的文件数量?
— Jorge Cornejo Bellido

3

这是另一种解决方案:

find . -type f |  egrep -o "\.[a-zA-Z0-9]+$" | sort -u | xargs -I '%' find . -type f -name "*%" -exec du -ch {} + -exec echo % \; | egrep "^\.[a-zA-Z0-9]+$|total$" | uniq | paste - -

得到扩展的部分是:

find . -type f |  egrep -o "\.[a-zA-Z0-9]+$" | sort -u

接下来搜索带有扩展名的文件,并将其打印在屏幕上:

xargs -I '%' find . -type f -name "*%" -exec du -ch {} + -exec echo % \;

接下来,我们要保留扩展名和总数:

egrep "^\.[a-zA-Z0-9]+$|total$" | uniq

并保持在同一行:

paste - -

在MacOS上可以使用。
— MichaelCodes

2

不如Stephane的解决方案好,但您可以尝试

find . -type f -name "*.png" -print0 | xargs -0r du -ch | tail -n1

您必须为每种类型的文件运行此命令。


1
假设只有很少的png文件du可以运行一次调用。使用GNU时xargs,您想要添加-r标志,以便在没有文件时du不运行(否则,您将获得当前目录的磁盘使用率)。您可能需要添加-type f或! type d以避免计算名称以结尾的目录中的文件.png。
— 斯特凡Chazelas

这只会寻找一个特定的扩展名。
— 拉胡尔

那就是我写的 为了获得“完整”的解决方案,必须将其包装在遍历所有适用扩展的脚本中。
— 反
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.