- 检查具有相同扩展名和相同大小的文件
- 使用一些哈希函数(md5,md6 应该更好)
第一种方法不太可靠,因为文件名不是文件的一部分。文件不能有扩展名。第二种方法在处理大文件时速度较慢。
我认为还有一些更有效的方法。
答案1
没有更有效的方法。
您可以检查文件大小是否相同,但很有可能出现误报。检查文件扩展名是无用的,因为您可能有两个相同的文件,但扩展名不同。
您可以检查文件内容精确匹配,例如使用cmp
命令,它是任何 Unix 安装的一部分。这比检查文件大小要慢得多,因为大小只是读取元数据,而逐字节比较需要读取两个文件的全部内容。
您可以计算校验和,这与上面的方法基本相同,但 (1) 在简单的双文件情况下会消耗更多 CPU,并且 (2) 使比较两个以上的文件变得容易得多。这样做的原因是您可以缓存校验和,这样您就不必为每个其他文件重新读取每个文件,只需比较校验和即可。
如果您有已知的文件类型(例如图像类型),则可以执行“更好”的近似相等测试(如果您的目标是近似相等)。任何此类方法都不会比上述任何方法消耗更少的 CPU 或更少的磁盘读取。
如果您的文件系统是 ZFS 或另一个“本地”对文件或块进行校验的 FS,那么您可以通过读取文件系统元数据来有效地比较文件。
实施通用重复查找器时,最好的选择是采用预置解决方案。如果必须自己执行,则应扫描并计算所有文件的校验和,维护结果数据库,然后在文件更改时刷新它(或者如果更适合您的情况,则定期刷新)。然后,重复检查就变成了查询数据库的简单而有效的方法。
答案2
更有效的方法是结合以下方法来避免无用的比较:
- 按文件大小对文件进行分组。
- 根据每个文件的开头数据的哈希值对文件进行分组。
- 使用哈希函数将每个哈希组中的文件相互比较。
选择的起始数据的大小应该足够大以保证其足够唯一(而不是头部)。
您可能需要考虑不要完全检查大文件,而是检查较小的部分并将它们列为“大文件/可能重复”而不是“完全重复”,并提供完整检查选项。
正如 phogg 提到的,如果您需要定期执行此行为:
您可能希望在每次更改文件时更新数据库中的哈希组...