Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env perl
- use strict;
- use Digest::SHA;
- use Cwd;
- use File::Util;
- my $topDir=cwd();
- my($f) = File::Util->new();
- my(@files) = $f->list_dir($topDir,'--recurse');
- my %hash;
- my $deleteFlag=$ARGV[0];
- #print $deleteFlag,"\n";
- foreach my $file(@files) {
- if(-d $file) {next;}
- my $size=$f->size($file);
- push @{$hash{$size}},$file;
- }
- my ($filectr,$setctr)=(0,0);
- foreach my $key (sort { $a <=> $b } keys %hash) {#loop through sizes
- my $value=$hash{$key};
- my @arr=@{$value};
- my $numFiles = @arr;
- if ($numFiles < 2) {next;}
- my %shahash;
- foreach my $file(@arr) { #loop through files of same size
- my $checksum=getSha512($file);
- push @{$shahash{$checksum}},$file; #files with same checksum resolve to same hash key
- }
- foreach my $shakey (sort { $a <=> $b } keys %shahash) { #loop through files of same hash value
- my $shavalue=$shahash{$shakey};
- my @shaarr=@{$shavalue};
- my $numFilesSha = @shaarr;
- if($numFilesSha < 2){next;}
- $setctr+=1;
- $filectr+=$numFilesSha;
- print "Files: $numFilesSha Size: $key Hash: $shakey\n";
- if($deleteFlag eq "-d") {
- for(my $i=0; $i<$numFilesSha-1;$i++) {
- my $item=$shaarr[$i];
- print "DELETE: $item\n";
- unlink $item;
- }
- print " KEEP: ",$shaarr[$numFilesSha-1],"\n";
- }
- else {
- foreach my $shaFile(@shaarr) {
- my $escaped = unixFilename($shaFile);
- print " rm $escaped\n";
- }
- }
- }
- }
- print "=== RESULTS ===\nFiles: $filectr Sets: $setctr\n";
- sub getSha512 {
- my ($filename)=@_;
- my $alg="512";
- my $sha = Digest::SHA->new($alg);
- $sha->addfile($filename);
- my $digest = $sha->hexdigest();
- return $digest;
- }
- sub unixFilename {
- my ($filename) = @_;
- $filename =~ s/\)/\\\)/g;
- $filename =~ s/\(/\\\(/g;
- $filename =~ s/\ /\\ /g;
- $filename =~ s/\;/\\\;/g;
- $filename =~ s/\'/\\\'/g;
- $filename =~ s/\"/\\\"/g;
- $filename =~ s/\&/\\\&/g;
- $filename =~ s/\!/\\\!/g;
- return $filename;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement