我有一个包含大量文件的文件夹,其中一些文件具有完全相同的内容.我想删除包含重复内容的文件,这意味着如果找到两个或多个重复内容的文件,我想留下其中一个文件,并删除其他文件.
以下是我提出的,但我不知道它是否有效:),还没试过.
你会怎么做? Perl或一般算法.
use strict; use warnings; my @files = <"./files/*.txt">; my $current = 0; while( $current <= $#files ) { # read contents of $files[$current] into $contents1 scalar my $compareTo = $current + 1; while( $compareTo <= $#files ) { # read contents of $files[compareTo] into $contents2 scalar if( $contents1 eq $contents2 ) { splice(@files,$compareTo,1); # delete $files[compareTo] here } else { $compareTo++; } } $current++; }
解决方法
Perl,带Digest :: MD5模块.
use Digest::MD5 ; %seen = (); while( <*> ){ -d and next; $filename="$_"; print "doing .. $filename\n"; $md5 = getmd5($filename) ."\n"; if ( ! defined( $seen{$md5} ) ){ $seen{$md5}="$filename"; }else{ print "Duplicate: $filename and $seen{$md5}\n"; } } 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; }
如果Perl不是必须的并且您正在使用* nix,则可以使用shell工具
find /path -type f -print0 | xargs -0 md5sum | \ awk '($1 in seen){ print "duplicate: "$2" and "seen[$1] } \ ( ! ($1 in seen ) ) { seen[$1]=$2 }'