#!/usr/bin/perl -w use strict; use File::Find; #use File::Finder; use Getopt::Std; my %opts; getopts('hd:p:s:t:rm',\%opts); usage() if ( $opts{h} || ( !$opts{d} ) ); my ($directory) = ("")x1; if ($opts{d}) { $directory = $opts{'d'}; } if ($opts{r}) { report(); } if ($opts{m}) { manage(); } my @dirList = ""; sub usage { print "Usage:\n\n"; print "\t dirmonitor -d "; } sub report { my ($owner,@ownersDirs,@ownersDirSizes,@fileList,%HoA_Sizes,%HoA_Dirs,@tokens, $user,$file,$dir,$size,$cat,$sum) = ("")x13; print "Inspecting directory: $directory ...\n\n"; find(\&wanted, $directory); #print "values: @dirList\n"; # Create a hash of arrays with our newly found directories, each array in the # hash contains directories that the user owns. Each array is keyed by the # owners user name. foreach (@dirList) { $user = getpwuid( (stat($_))[4] ); $dir=$_; # split up the info that du returns into tokens, resuse @tokens array @tokens = split(' ', qx(du -s "$dir"), 2); $size = $tokens[0]; # push the sizes of the users directories onto users stack push @{$HoA_Sizes{$user}}, $size; push @{$HoA_Dirs{$user}}, $dir; } # sum up the sizes of directories that the user owns foreach $owner ( keys %HoA_Sizes ) { # dereference the array reference and grab the list of values @ownersDirSizes = @{ $HoA_Sizes{$owner} }; @ownersDirs = @{ $HoA_Dirs{$owner} }; for my $i (0 .. $#ownersDirs) { if ($i ne $directory) { $sum += $ownersDirSizes[$i]; print "$ownersDirSizes[$i] dir: $ownersDirs[$i]\n"; } } push @{$HoA_Sizes{$owner}}, $sum; print "sum is: $sum\n"; $sum = 0; } # sort the hash of arrays by comparing the first value of a users # array(sum of all users dirs) foreach $owner ( sort { $HoA_Sizes{$b}->[-1] <=> $HoA_Sizes{$a}->[-1] } keys %HoA_Sizes ) { print "$owner: @{[int($HoA_Sizes{$owner}->[-1])]}KB\n"; } } sub wanted { if (-d $_) { if ($_ ne ".") { #print "we have: $_ and $directory\n"; push(@dirList,$File::Find::name); } } }