Em um sistema GNU:
find . -name '?*.*' -type f -printf '%b.%ffind . -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{$_}, $_;
}
}'
' |
awk -F . -v RS=' 12288 1 pnm
16384 4 gif
204800 2 ico
1040384 17 jpg
2752512 83 png
' '
{s[$NF] += $1; n[$NF]++}
END {for (e in s) printf "%15d %4d %s\n", s[e]*512, n[e], e}' |
sort -n
Ou o mesmo com perl , evitando a extensão -printf do GNU find (ainda usando uma extensão GNU, -print0 , mas essa é mais amplamente suportada hoje em dia):
find . -name '?*.*' -type f -printf '%b.%ffind . -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{$_}, $_;
}
}'
' |
awk -F . -v RS=' 12288 1 pnm
16384 4 gif
204800 2 ico
1040384 17 jpg
2752512 83 png
' '
{s[$NF] += $1; n[$NF]++}
END {for (e in s) printf "%15d %4d %s\n", s[e]*512, n[e], e}' |
sort -n
Ele fornece uma saída como:
%pre% Se você quiser KiB , MiB ... sufixos, canalizar para numfmt --to=iec-i --suffix=B .
%b*512 fornece o uso do disco, mas observe que, se os arquivos forem vinculados várias vezes, eles serão contados várias vezes, portanto você poderá ver uma discrepância com o que du reporta.