Find

如何查找按副檔名分組的總文件大小

  • February 2, 2022

我在與其他同事共享的集群上工作。硬碟是有限的(並且在某些情況下已經滿了),所以我偶爾清理一下我的部分。我想快速做到這一點,所以直到現在我通過列出超過 3 個月的大於 100 MB 的文件來做到這一點,我看看我是否仍然需要它們。

但現在我在想,可能有一個文件夾包含超過 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

在 GNU 系統上:

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

或與 相同perl,避免-printfGNU 的擴展find(仍在使用 GNU 擴展,-print0但現在更廣泛地支持這個):

LC_ALL=C find . -name '?*.*' -type f -print0 |
 perl -0ne '
   if (@s = lstat$_){
     ($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報告的內容存在差異。


¹ 作為一個例外,在 HP/UX 上,由lstat()/報告的塊大小stat()是 1024 而不是 512。GNUfind對此進行了調整,因此它%b仍然代表 512 字節單元的數量,但是使用perl,您需要乘以 1024 而不是那裡.

引用自:https://unix.stackexchange.com/questions/308846