按内容跨多个目录查找重复文件

时间:2010-03-08 03:52:24

标签: regex duplicate-data

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

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

4 个答案:

答案 0 :(得分:5)

如果您正在使用linux / * nix系统,则可以使用shasha512sum工具,因为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工具

答案 1 :(得分: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;
                }
        }
}

答案 2 :(得分:2)

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

正则表达式无法解决这个问题。

网上有很多代码示例,我现在没有时间删除此代码。 (这可能会引起一些挫折 - 耸耸肩!)

答案 3 :(得分:2)

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

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

修改

参考:两个不同的文件可以具有相同的md5校验和:(MD5 collision vulnerability (wikipedia)

  

然而,现在很容易   生成MD5碰撞,它是   可能是创建者   用于创建第二个文件的文件   相同的校验和,所以这种技术   不能保护某些形式的   恶意篡改。还有,在一些   无法信任校验和的情况   (例如,如果它是通过获得的   与下载的频道相同   文件),在这种情况下MD5只能   提供错误检查功能:   它会识别出腐败或腐败   不完整下载,成为   下载更大的可能性更大   文件。