我从互联网上下载了一些与特定主题相关的文件。现在我想检查文件是否有任何重复。问题是文件的名称会不同,但内容可能匹配。
有没有办法实现一些代码,它将遍历多个文件夹并告知哪些文件是重复的?
我从互联网上下载了一些与特定主题相关的文件。现在我想检查文件是否有任何重复。问题是文件的名称会不同,但内容可能匹配。
有没有办法实现一些代码,它将遍历多个文件夹并告知哪些文件是重复的?
如果你在 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 工具
您可以递归地遍历文件夹并找到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;
}
}
}
对所有文件进行递归搜索,按大小排序,两个或多个文件的任何字节大小,进行 MD5 哈希或 SHA1 哈希计算以查看它们是否实际上相同。
正则表达式不会帮助解决这个问题。
网上有很多代码示例,我现在没有时间敲这些代码。(这可能会引起一些反对票 - 耸耸肩!)
MD5 是查找两个相同文件的好方法,但假设两个文件相同是不够的!(实际上风险很小但存在)所以你还需要比较内容
PS:另外如果你只是想检查文本内容,如果返回字符'\n'在windows和linux中是不同的
编辑:
参考:两个不同的文件可以有相同的md5校验和:(MD5碰撞漏洞(维基百科))
但是,既然生成 MD5 冲突很容易,那么创建文件的人就有可能创建具有相同校验和的第二个文件,因此这种技术无法防止某些形式的恶意篡改。此外,在某些情况下,校验和是不可信的(例如,如果它是通过与下载文件相同的渠道获得的),在这种情况下,MD5 只能提供错误检查功能:它会识别损坏或不完整的下载,这下载较大的文件时更有可能。