【问题标题】:Remove identical files in UNIX在 UNIX 中删除相同的文件
【发布时间】:2010-03-08 10:20:18
【问题描述】:

我正在处理大约 10MB 大小的大量 (30,000) 个文件。其中一些(我估计 2%)实际上是重复的,我只需要为每个重复的对(或三胞胎)保留一份副本。 你能建议我一个有效的方法吗?我正在研究 unix。

【问题讨论】:

  • 复制可以根据以下1.内容2.文件名你想怎么做?
  • 内容 :-) 基于文件名太容易了

标签: shell file unix duplicates


【解决方案1】:

你可以试试这个 sn-p 在删除之前先获取所有重复项。

find /path -type f -print0 | xargs -0 sha512sum | awk '($1 in seen){print "duplicate: "$2" and "seen[$1] }(!($1 in  seen)){seen[$1]=$2}' 

【讨论】:

    【解决方案2】:

    我会编写一个脚本来创建每个文件的哈希值。您可以将散列存储在一个集合中,迭代文件,并且在文件散列到集合中已经找到的值的位置,删除该文件。例如,这在 Python 中是微不足道的。

    对于 30,000 个文件,每个哈希表条目 64 字节,您只看到大约 200 兆字节。

    【讨论】:

    • 什么是元字节?某种理想化的字节?只有当你有一个完美的散列函数时,你的解决方案才有效。
    • 什么不是元字节?固定的。偏执狂可以在删除的情况下比较文件的内容。添加额外的哈希值也会有所帮助。
    • @Neil 如果你使用一个现代的、当前完整的加密散列函数并且你发现了一个冲突,你的算法就会崩溃,但你已经获得了一份加密论文,所以这一切都是胜利的。不过,在删除其中一个之前比较假定的重复项是值得的。
    • 正确的加密散列函数并不是通过简单的计数参数就完美的,但您可以将它们视为所有意图和目的。
    • @Pascal 肯定会发生冲突。考虑一个文件可以看作是一个非常大的单个二进制数,比散列大得多。因此,冲突是不可避免的,因为散列会丢失信息。
    【解决方案3】:

    查找可能的重复文件:

    find DIR -type f -exec sha1sum "{}" \; | sort | uniq -d -w40
    

    现在您可以使用cmp 检查文件是否真的相同。

    【讨论】:

    • -w 是 gnu uniq 的一个特性; -d 只会找到连续的重复项,所以你必须先排序
    • 您可以将sort 的输出通过管道传输到cut -d \ -f 1,然后通过管道传输到uniq -d,而不是使用-w(仅在GNU 中)。这更便携。它适用于 BSD、OS X 和其他系统。
    • @monokrome:呃……不。那只会给你没有文件名的校验和。如果没有 GNU uniq,则必须使用 awk,它是模拟 uniq 的关联数组。
    【解决方案4】:

    有一个现有的工具:fdupes

    从旧的已删除答案恢复解决方案。

    【讨论】:

      【解决方案5】:

      编写一个脚本,首先比较文件大小,然后是 MD5 校验和(当然是缓存它们),如果您非常担心丢失数据,请咬紧牙关,逐字节比较重复的候选对象。如果您对文件是如何产生的等没有额外的了解,那么它真的不能更有效地完成。

      【讨论】:

      • 这是一个来自不同来源的高吞吐量下载,所以我得到了一些冗余。我会尝试 md5sum,所以我应该得到所有这些的哈希码。我会告诉你它是否有效:-)
      【解决方案6】:

      将所有文件名保存在一个数组中。然后遍历数组。在每次迭代中,使用命令md5sum 将文件内容与其他文件的内容进行比较。如果 MD5 相同,则删除该文件。

      例如,如果文件 b 是文件 a 的副本,则这两个文件的 md5sum 将相同。

      【讨论】:

      • 您可能需要考虑该特定方法的算法复杂性...
      猜你喜欢
      • 1970-01-01
      • 2012-06-02
      • 2012-09-18
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多