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


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

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

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


这个问题在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

如果需要KiBMiB...后缀,请连接到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.