4

我从互联网上下载了一些与特定主题相关的文件。现在我想检查文件是否有任何重复。问题是文件的名称会不同,但内容可能匹配。

有没有办法实现一些代码,它将遍历多个文件夹并告知哪些文件是重复的?

4

4 回答 4

5

如果你在 linux/*nix 系统上工作,你可以使用sha类似的工具sha512sum,现在 md5 可以被破坏。

find /path -type f -print0 | xargs -0 sha512sum | awk '($1 in seen){print "duplicate: "$2" and "seen[$1] }(!($1 in  seen)){seen[$1]=$2}' 

如果你想使用 Python,一个简单的实现

import hashlib,os
def sha(filename):    
    ''' function to get sha of file '''
    d = hashlib.sha512()
    try:
        d.update(open(filename).read())
    except Exception,e:
        print e
    else:
        return d.hexdigest()
s={}
path=os.path.join("/home","path1")
for r,d,f in os.walk(path):
    for files in f:
        filename=os.path.join(r,files)
        digest=sha(filename)
        if not s.has_key(digest):
            s[digest]=filename
        else:
            print "Duplicates: %s <==> %s " %( filename, s[digest])

如果你认为 sha512sum 还不够,你可以使用 diff 或filecmp (Python)之类的 unix 工具

于 2010-03-08T04:00:24.213 回答
4

您可以递归地遍历文件夹并找到MD5每个文件的文件夹,然后查找重复MD5值,这将明智地提供重复文件的内容。你想用哪种语言来实现它?

下面是做上述事情的 Perl 程序:

use strict;
use File::Find;
use Digest::MD5 qw(md5);    

my @directories_to_search = ('a','e');
my %hash;

find(\&wanted, @directories_to_search);

sub wanted  {

        chdir $File::Find::dir;
        if( -f $_) {
                my $con = '';
                open F,"<",$_ or die;
                while(my $line = <F>) {
                        $con .= $line;
                }
                close F;
                if($hash{md5($con)}) {
                        print "Dup found: $File::Find::name and $hash{md5($con)}\n";
                } else {
                        $hash{md5($con)} = $File::Find::name;
                }
        }
}
于 2010-03-08T03:56:26.890 回答
2

对所有文件进行递归搜索,按大小排序,两个或多个文件的任何字节大小,进行 MD5 哈希或 SHA1 哈希计算以查看它们是否实际上相同。

正则表达式不会帮助解决这个问题。

网上有很多代码示例,我现在没有时间敲这些代码。(这可能会引起一些反对票 - 耸耸肩!)

于 2010-03-08T03:56:50.260 回答
2

MD5 是查找两个相同文件的好方法,但假设两个文件相同是不够的!(实际上风险很小但存在)所以你还需要比较内容

PS:另外如果你只是想检查文本内容,如果返回字符'\n'在windows和linux中是不同的

编辑:

参考:两个不同的文件可以有相同的md5校验和:(MD5碰撞漏洞(维基百科)

但是,既然生成 MD5 冲突很容易,那么创建文件的人就有可能创建具有相同校验和的第二个文件,因此这种技术无法防止某些形式的恶意篡改。此外,在某些情况下,校验和是不可信的(例如,如果它是通过与下载文件相同的渠道获得的),在这种情况下,MD5 只能提供错误检查功能:它会识别损坏或不完整的下载,这下载较大的文件时更有可能。

于 2010-03-08T04:03:24.033 回答