加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:54:30 所属栏目:大数据 来源:网络整理
导读:我有一个包含大量文件的文件夹,其中一些文件具有完全相同的内容.我想删除包含重复内容的文件,这意味着如果找到两个或多个重复内容的文件,我想留下其中一个文件,并删除其他文件. 以下是我提出的,但我不知道它是否有效:),还没试过. 你会怎么做? 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 .. $filenamen";
    $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 }'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读