我从互联网上下载了一些与特定主题相关的文件。现在我想检查文件是否有任何重复。问题是文件的名称会有所不同,但内容可能会匹配。
有没有办法实现一些代码,它会迭代多个文件夹并告知哪些文件是重复的?
答案 0 :(得分: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工具
答案 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只能 提供错误检查功能: 它会识别出腐败或腐败 不完整下载,成为 下载更大的可能性更大 文件。