Find
如何查找按副檔名分組的總文件大小
我在與其他同事共享的集群上工作。硬碟是有限的(並且在某些情況下已經滿了),所以我偶爾清理一下我的部分。我想快速做到這一點,所以直到現在我通過列出超過 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
,避免-printf
GNU 的擴展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
如果你想
KiB
,MiB
…後綴,管道到numfmt --to=iec-i --suffix=B
.
%b*512
給出磁碟使用情況¹,但請注意,如果文件被多次硬連結,它們將被計算多次,因此您可能會看到與du
報告的內容存在差異。¹ 作為一個例外,在 HP/UX 上,由
lstat()
/報告的塊大小stat()
是 1024 而不是 512。GNUfind
對此進行了調整,因此它%b
仍然代表 512 字節單元的數量,但是使用perl
,您需要乘以 1024 而不是那裡.