我正在处理大量(30,000)大小约10MB的文件。其中一些(我估计有2%)实际上是重复的,我需要为每个重复的对(或三元组)保留一份副本。 你能建议我这样做的有效方法吗?我正在研究unix。
答案 0 :(得分:2)
我会编写一个脚本来创建每个文件的哈希值。您可以将哈希存储在一个集合中,遍历文件,并且文件哈希到已在集合中找到的值,删除该文件。例如,在Python中这很简单。
对于30,000个文件,每个哈希表条目为64字节,你只需要大约200兆字节。
答案 1 :(得分:2)
查找可能的重复文件:
find DIR -type f -exec sha1sum "{}" \; | sort | uniq -d -w40
现在您可以使用cmp
检查文件是否完全相同。
答案 2 :(得分:2)
您可以尝试使用此代码段在删除之前先获取所有重复项。
find /path -type f -print0 | xargs -0 sha512sum | awk '($1 in seen){print "duplicate: "$2" and "seen[$1] }(!($1 in seen)){seen[$1]=$2}'
答案 3 :(得分:1)
编写一个首先比较文件大小的脚本,然后编写MD5校验和(当然是缓存它们),如果你非常担心丢失数据,那么咬住子弹并实际比较重复的候选字节。如果你没有关于文件是如何形成等的额外知识,那么它实际上无法更有效地完成。
答案 4 :(得分:1)
有一个用于此目的的现有工具:fdupes
从已删除的旧答案恢复解决方案。
答案 5 :(得分:0)
将所有文件名保存在数组中。然后遍历数组。在每次迭代中,使用命令md5sum
将文件内容与其他文件的内容进行比较。如果MD5相同,则删除该文件。
例如,如果文件b
与文件a
重复,则md5sum
对于这两个文件都是相同的。