#!/usr/bin/perl -w use strict; my %byFile; sub sortBySize { my $a_units = $byFile{$a} || 'x'; my $b_units = $byFile{$b} || 'x'; my $a_value = $byFile{$a}; my $b_value = $byFile{$b}; $a_units =~ s/\d+[\.\d+]+([k|kB|MB|GB])/$1/g; $b_units =~ s/\d+[\.\d+]+([k|kB|MB|GB])/$1/g; $a_value =~ s/$a_units//g; $b_value =~ s/$b_units//g; if ( $a_units eq $b_units ) { my $v = $a_value <=> $b_value; return $v; } elsif ( ($a_units eq "k" or $a_units eq "kB") and ($b_units eq "k" or $b_units eq "kB") ) { my $v = $a_value <=> $b_value; return $v; } elsif ( $a_units eq "GB" ) { return 1; } elsif ( $b_units eq "GB" ) { return -1; } elsif ( $a_units eq "MB" ) { return 1; } elsif ( $b_units eq "MB" ) { return -1; } elsif ( $a_units eq "kB" or $a_units eq "k" ) { return 1; } elsif ( $b_units eq "kB" or $a_units eq "k" ) { return -1; } else { return 0; } } open ( DUSH, "du -sH *|") or die __FILE__ . "[" . __LINE__ . "] Can't execute du -SH *:$!\n"; for () { my ( $size, $name ) = split /\s+/; $byFile{$name} = $size; } for ( reverse sort sortBySize keys %byFile ) { print "$_\t=>$byFile{$_}\n"; }