29 lines
834 B
Perl
29 lines
834 B
Perl
use File::Find;
|
|
use List::Util qw(max);
|
|
|
|
my %fsize;
|
|
$dir = shift || '.';
|
|
find(\&fsize, $dir);
|
|
|
|
$max = max($max,$fsize{$_}) for keys %fsize;
|
|
$total += $size while (undef,$size) = each %fsize;
|
|
|
|
print "File size distribution in bytes for directory: $dir\n";
|
|
for (0 .. max(keys %fsize)) {
|
|
printf "# files @ %4sb %8s: %s\n", $_ ? '10e'.($_-1) : 0, $fsize{$_} // 0,
|
|
histogram( $max, $fsize{$_} // 0, 80);
|
|
}
|
|
print "$total total files.\n";
|
|
|
|
sub histogram {
|
|
my($max, $value, $width) = @_;
|
|
my @blocks = qw<| ▏ ▎ ▍ ▌ ▋ ▊ ▉ █>;
|
|
my $scaled = int $value * $width / $max;
|
|
my $end = $scaled % 8;
|
|
my $bar = int $scaled / 8;
|
|
my $B = $blocks[8] x ($bar * 8) . ($end ? $blocks[$end] : '');
|
|
}
|
|
|
|
sub fsize { $fsize{ log10( (lstat($_))[7] ) }++ }
|
|
sub log10 { my($s) = @_; $s ? int log($s)/log(10) : 0 }
|