1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| #!/usr/bin/perl
#
use File::Find;
use Digest::SHA1;
use Fcntl ':mode';
use Data::Dumper;
my %files = ();
my %byUsers = ();
@dirs = ('/');
find({ wanted => \&hashAndAdd, no_chdir => 1}, @dirs);
sub hashAndAdd {
my $f = $_;
if(-f $f and ! -l $f) {
($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime,
$mtime, $ctime, $blksize, $blocks) = stat($f);
$o = open FILE, $f;
if($o and $size > 0) {
my $sha1 = Digest::SHA1->new;
$sha1->addfile(FILE);
$d = $sha1->hexdigest;
$files{$d} = [] unless defined $files{$d};
($name, $p, $u, $g, $q, $c, $gc, $home) =
getpwuid $uid;
%iUser = (name => $name, home => $home);
%iFile = (file => $f, size => $size,
user => { %iUser } );
$byUsers{$name} = [] unless defined $byUsers{$name};
push ( @{$files{$d}}, { %iFile });
push( @{$byUsers{$name}}, ref $files{$d});
}
close FILE;
}
}
print "RESULTS\n\n";
my $totSize = 0;
my $fileFOUND = 0;
foreach $k (keys %files) {
if(($#{ $files{$k} } + 1) > 1) {
print "FOR :: " . $k . " :: FOUND\n";
my $first = 0;
foreach $a (@{ $files{$k} }) {
$fileFOUND++;
print " -> $a->{file} - $a->{size} - " .
"$a->{user}{name} - $a->{user}{home}\n";
$totSize += $a->{size} unless $first eq 0;
$first = 1;
}
} else {
delete $files{$k};
}
}
$totSize = $totSize ;
print "Total wasted size :: $totSize\n";
print "TOTAL FILES :: $fileFOUND\n";
1; |
Partager