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

14 ls find disk-usage

我在与其他同事共享的集群上工作。硬盘是有限的(并且在某些情况下已经满了),所以我偶尔会清理我的部分。我想快速完成此操作,因此直到现在,我通过列出超过 3 个月的大于 100 MB 的文件列表来执行此操作,然后看看我是否仍然需要它们。

但现在我想可能有一个文件夹包含超过 1000 个我错过的小文件,所以我想找到一种简单的方法来查看是否是这种情况。从我生成数据的方式来看,这将有助于获得每个扩展的总大小列表。在这个问题的上下文中,“扩展名”作为文件名中最后一个点后面的所有内容。

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

folder1/file1.bmp   40 kiB
folder1/file2.jpg   20 kiB
folder2/file3.bmp   30 kiB
folder2/file4.jpg    8 kiB
Run Code Online (Sandbox Code Playgroud)

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

bmp 70 kiB
jpg 28 kiB
Run Code Online (Sandbox Code Playgroud)

我不关心没有扩展名的文件,因此它们可以被忽略或归为一类。

我已经浏览了ls,du和 的手册页find,但我不知道什么是适合这项工作的工具......

Sté*_*las 18

在 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
Run Code Online (Sandbox Code Playgroud)

或以相同的perl,避免了-printfGNU的扩展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{$_}, $_;
      }
    }'
Run Code Online (Sandbox Code Playgroud)

它给出如下输出:

          12288    1 pnm
          16384    4 gif
         204800    2 ico
        1040384   17 jpg
        2752512   83 png
Run Code Online (Sandbox Code Playgroud)

如果你想要KiB, MiB... 后缀,管道到numfmt --to=iec-i --suffix=B.

%b*512给出磁盘使用情况,但请注意,如果文件被多次硬链接,它们将被计算多次,因此您可能会看到与du报告内容的差异。


cou*_*ode 7

不如斯蒂芬的解决方案那么好,但你可以尝试

find . -type f -name "*.png" -print0 | xargs -0r du -ch | tail -n1
Run Code Online (Sandbox Code Playgroud)

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

  • 假设有足够少的 png 文件,只运行一个“du”调用。使用 GNU `xargs`,您需要添加 `-r` 标志,这样当没有文件时 du 就不会运行(否则,您最终会得到当前目录的磁盘使用情况)。您可能需要添加 `-type f` 或 `! 输入 d` 以避免计算名称以“.png”结尾的目录中的文件。 (2认同)

小智 5

这是另一个解决方案:

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 - -
Run Code Online (Sandbox Code Playgroud)

获得扩展的部分是:

find . -type f |  egrep -o "\.[a-zA-Z0-9]+$" | sort -u
Run Code Online (Sandbox Code Playgroud)

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

xargs -I '%' find . -type f -name "*%" -exec du -ch {} + -exec echo % \;
Run Code Online (Sandbox Code Playgroud)

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

egrep "^\.[a-zA-Z0-9]+$|total$" | uniq
Run Code Online (Sandbox Code Playgroud)

并保持在同一行:

paste - -
Run Code Online (Sandbox Code Playgroud)