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.