| Category: | Utility Scripts |
| Author/Contact Info | Harold Sinclair harold@hastek.net |
| Description: | piglist makes a formatted, sorted list of subdirectory names and their sizes in K. If the path names are longer than 44 characters, piglist reformats itself to output a 132 character wide report. piglist uses File::Find and the output of 'du', on unix/linux |
#!/usr/bin/perl -w
# $Id: piglist 468 2006-12-11 01:57:35Z hsinclai $
# harold@hastek.net
use strict;
use Getopt::Std;
use File::Find;
use Cwd;
getopts('h');
our($opt_h);
my $workdir;
my $wide_term = 0;
my @dirlist;
my %sizelist;
my $marker = '-' x 56;
my $markerlong = $marker x 2;
my $me = $0;
$me =~ s@^\.\/|\/.*\/@@g;
my $version = '0.1';
&usage if defined $opt_h;
#---Get directory for analysis
if ( $ARGV[0] ) {
$workdir = $ARGV[0] ;
-d $workdir || &bad_directory;
} else {
$workdir = getcwd();
}
#---Get the dirs and sizes
finddepth( { wanted => \&dirlister }, $workdir );
for my $entryin ( @dirlist ) {
my $dusize = qx!/usr/bin/du -s "$entryin"!;
my $realsize = (split /\t/,$dusize)[0];
chomp $realsize;
$sizelist{$entryin} = $realsize;
#to see real du output
#system("/usr/bin/du", "-s", "$entryin");
}
#---Path names longer than about 44 will need a wider display
foreach ( keys(%sizelist) ) {
length($_) > 44 and $wide_term = 1;
}
#---Print
#------------------Header
print "\n\n Sizes in K for $workdir\n";
$wide_term == 0 ? print ' ' . $marker . $/ : print ' ' . $markerlong
+. $/ ;
#------------------Content
my @ordered = sort { $sizelist{$b} <=> $sizelist{$a} } keys %sizelist;
if ( $wide_term == 0 ) {
print sprintf("%15d ",$sizelist{$_}), sprintf("%-65s",$_) . $/ f
+or @ordered;
} elsif ( $wide_term == 1 ) {
print sprintf("%15d ",$sizelist{$_}), sprintf("%-132s",$_) . $/
+for @ordered;
}
#------------------Footer
print $/;
$wide_term == 0 ? print ' ' . $marker . $/ : print ' ' . $markerlong .
+ $/;
print $wide_term == 0 ? sprintf("% 57s","$me v$version") : sprintf("%
+ 113s","$me version $version") ;
print $/x2;
#---Subs
sub dirlister {
return if -f $_;
return if $_ =~ /^\.\.$/;
-d $_ and push @dirlist, $File::Find::name;
return @dirlist;
}
sub usage
{
print "\n Usage: $me [PATH] \n";
print ' ' . $marker . $/;
print " List individual size in K for subdirectories of PA
+TH\n";
print " If no path specified, use current working director
+y \n\n";
exit 0;
}
sub bad_directory {
print "\n Error: Cannot find directory \"$workdir\" \n\
+n"; exit 1;
}
=head1 NAME
piglist - report directory sizes
=head1 SYNOPSIS
piglist [PATH]
piglist -h
If PATH is specified, piglist reports subdirs of PATH, and
If PATH is omitted, the current directory is listed.
piglist -h invokes usage.
=head1 DESCRIPTION
piglist makes a formatted, sorted list of subdirectory names and th
+eir sizes in K.
If the path names are longer than 44 characters, piglist reformats
+itself to output
a 132 character wide report.
piglist uses File::Find and the output of 'du', on unix/linux
=head1 WARNINGS
Recursive File::Find/du can be a little expensive, and might be impo
+lite to run on
a busy or shared machine.
piglist does not follow symbolic links, maybe should add this abilit
+y
=head1 BUGS AND CAVEATS
To get a proper listing in wide format, make the terminal at least 1
+50 characters wide;
piglist uses a few more characters for margins.
Because of line wrapping, output in an 80x24 terminal looks bad.
=cut
#eof
|
|
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: piglist
by tuxz0r (Pilgrim) on Nov 17, 2007 at 02:12 UTC | |
by hsinclai (Deacon) on Nov 17, 2007 at 02:43 UTC | |
by parv (Parson) on Nov 17, 2007 at 04:04 UTC | |
by jasonk (Parson) on Nov 18, 2007 at 19:50 UTC |