列出给定根目录的文件系统中的所有重复文件。

时间:2016-11-19 09:20:49

标签: algorithm performance oop hash filesystems

您如何设计算法以列出文件系统中的所有重复文件?我首先想到它使用散列,但我想知道是否有更好的方法来实现它。要记住任何可能的设计权衡吗?

1 个答案:

答案 0 :(得分:2)

散列所有文件将花费很长时间,因为您必须阅读所有文件内容。

我建议使用3步算法:

  1. 扫描您的目录并记下路径&文件大小
  2. 只散列与其他文件大小相同的文件,只有当文件大小超过2个且文件大小相同时:如果文件与另一个文件大小相同,则不需要散列,只需一对一地比较它们的内容(保存散列时间,之后就不需要哈希值)
  3. 即使哈希是相同的,你仍然需要比较每个字节的字节数,因为不同文件的哈希值可能是相同的(尽管如果文件大小相同而且它是你的话,这是不太可能的 filesystem)。
  4. 您也可以不进行哈希处理,如果可能的话,同时打开所有文件,并比较内容。这将节省大文件的多次读取。根据您的数据类型,您可以实施许多调整以节省时间(例如:如果2个压缩/ tar文件具有相同的大小> x Ggigabytes大小(和相同的名称),请不要阅读内容,根据您的过程,文件很可能是重复的)

    这样,您可以避免散列文件,其大小在系统中是唯一的。节省了大量时间。

    注意:我这里不考虑名字,因为我认为名字可能不同。

    编辑:我做了一些研究(太晚了),发现如果你使用类似Un * x的系统,fdupes似乎就是这样做了:

    https://linux.die.net/man/1/fdupes

    在该问题中看到:List duplicate files in a directory in Unix