File size distribution: Difference between revisions
Content added Content deleted
m (→{{header|REXX}}: added wording to the REXX section header.) |
SqrtNegInf (talk | contribs) (Added Perl example) |
||
Line 272: | Line 272: | ||
Number of inaccessible files : 0 |
Number of inaccessible files : 0 |
||
</pre> |
</pre> |
||
=={{header|Perl}}== |
|||
{{trans|Perl 6}} |
|||
<lang 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; |
|||
push @res, "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 }</lang> |
|||
{{out}} |
|||
<pre># files @ 0b 5: |
|||
# files @ 10e0b 46455: ████████████████████████████████████████████████████████████████████████████████ |
|||
# files @ 10e1b 26146: ████████████████████████████████████████▋ |
|||
# files @ 10e2b 3993: ▊ |
|||
# files @ 10e3b 1222: ▎ |
|||
# files @ 10e4b 19: |
|||
# files @ 10e5b 3: |
|||
77843 total files.</pre> |
|||
=={{header|Perl 6}}== |
=={{header|Perl 6}}== |