#!/usr/bin/perl -w use File::Find; sub DirectorySize { my $dir = shift; my $sizeSum = 0; # Find all child files and directories and sum their sizes. find(sub { my @statData = stat; $sizeSum += $statData[12]; }, $dir); return $sizeSum * 512; } sub HumanReadable { my $size = shift; for my $prefix (split //, " kMGTPEZ") { return sprintf("%.1f%s", $size, $prefix) if($size < 10); return sprintf("%.0f%s", $size, $prefix) if($size < 1000); $size /= 1024; } return sprintf("%.0fY", $size); } my $order = 1; while (@ARGV) { my $arg = shift; $order *= -1 if ($arg =~ /^-r$/); } # Find all immediate children, except . and .. my @children = grep { !/^\.{1,2}$/ } <* .*>; # Count the sizes of the children. my @childrenSizes = map { [ DirectorySize($_), $_ ] } @children; # Sort by size. @childrenSizes = sort { $order * ($a->[0] <=> $b->[0]) } @childrenSizes; for my $childData (@childrenSizes) { printf("\e[1;31;43m*\e[0m %s\t%s\n", HumanReadable($childData->[0]), $childData->[1]); }