从单个目录中删除具有重复内容的文件[Perl或算法]

前端之家收集整理的这篇文章主要介绍了从单个目录中删除具有重复内容的文件[Perl或算法]前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个包含大量文件文件夹,其中一些文件具有完全相同的内容.我想删除包含重复内容文件,这意味着如果找到两个或多个重复内容文件,我想留下其中一个文件,并删除其他文件.

以下是我提出的,但我不知道它是否有效:),还没试过.

你会怎么做? 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 }'

猜你在找的Perl相关文章