我试图实现这一点是Mac OS,试图通过使用fdupes实现类似但不起作用。这是我想要实现的目标:
我修改了一些与此处相似的东西,但我必须多次运行才能取出重复项。它不会在单次运行中检测重复项(必须多次运行才能检测到重复项)。不确定它是否正常工作
use Digest::MD5;
%check = ();
while (<*>) {
-d and next;
$fname = "$_";
print "checking .. $fname\n";
$md5 = getmd5($fname) . "\n";
if ( !defined( $check{$md5} ) ) {
$check{$md5} = "$fname";
}
else {
print "Found duplicate files: $fname and $check{$md5}\n";
print "Deleting duplicate $check{$md5}\n";
unlink $check{$md5};
}
}
sub getmd5 {
my $file = "$_";
open( FH, "<", $file ) or die "Cannot open file: $!\n";
binmode(FH);
my $md5 = Digest::MD5->new;
$md5->addfile(FH);
close(FH);
return $md5->hexdigest;
}
答案 0 :(得分:1)
您应该限制必须阅读每个文件的内容的次数:
使用Path::Class
或类似方法清点文件。
一个。构建与文件大小相关的哈希值和MD5::Digest
到文件名列表。
仅比较可能的重复项。匹配文件大小和摘要。
以下是未经测试的:
use strict;
use warnings;
use Path::Class;
use Digest::MD5;
my $dir = dir('.');
my %files_per_digest;
# Inventory Directory
while ( my $file = $dir->next ) {
my $size = $file->stat->size;
my $digest = do {
my $md5 = Digest::MD5->new;
$md5->addfile( $file->openr );
$md5->hexdigest;
};
push @{ $files_per_digest{"$size - $digest"} }, $file;
}
# Compare likely duplicates only
for my $files ( grep { @$_ > 1 } values %files_per_digest ) {
# Sort by alpha
@$files = sort @$files;
print "Comparing: @files\n";
for my $i ( reverse 0 .. $#files ) {
for my $j ( 0 .. $i - 1 ) {
my $fh1 = $files->[$i]->openr;
my $fh2 = $files->[$j]->openr;
my $diff = 0;
while ( !eof($fh1) && !eof($fh2) ) {
$diff = 1, last if scalar(<$fh1>) ne scalar(<$fh2>);
}
if ( $diff or !eof($fh1) or !eof($fh2) ) {
print " $files->[$i] ($i) is duplicate of $files->[$j] ($j)\n";
$files->[$i]->remove();
splice @$files, $i, 1;
}
}
}
}
答案 1 :(得分:0)
我过去使用过rdfind非常成功。它非常准确,快速,似乎比fdupes更精简。根据{{3}}(RDFind's web site),可以使用MacPorts进行安装。