A quick rewrite:
use strict;
use IO::File;
my $size;
my $inode;
my $sum = 0;
my @entries;
my $e;
my $percent = 0;
my $remsum = 0;
my $counter = 0;
my $du = new IO::File;
if (@ARGV) {
chdir "$ARGV[0]" or die "cannot change to [ $ARGV[0] ]\n";
}
$du->open("du -sk *|") or
die "cannot open du program and pipe";
while (<$du>) {
($size, $inode)=split;
$inode .= "/" if (-d $inode);
$sum += $size;
push @entries, { size => $size, inode => $inode };
}
@entries = sort { $b->{size} <=> $a->{size} } @entries;
$du->close;
foreach $e (@entries) {
$percent = $e->{size}/$sum*100;
if ($counter < 10) {
printf(
"%30s | %5d | %5.2f%%\n",
$e->{inode},
$e->{size},
$percent);
}
else {
$remsum += $e->{size};
}
$counter++;
}
if ($remsum > 0) {
printf(
"%30s | %5d | %5.2f%%\n",
"REMAINING FILES",
$remsum,
$remsum/$sum*100);
}
Edits:
* moved sort out of loop
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|