【发布时间】:2015-10-24 05:00:53
【问题描述】:
我今天不得不编写一个 Bash 脚本来删除重复文件,使用它们的 md5 哈希值。我将这些哈希作为文件存储在一个临时目录中:
for i in * ; do
hash=$(md5sum /tmp/msg | cut -d " " -f1) ;
if [ -f /tmp/hashes/$hash ] ;
then
echo "Deleted $i" ;
mv $i /tmp/deleted ;
else
touch /tmp/hashes/$hash ;
fi ;
done
它工作得很好,但让我想知道:这是一种省时的方式吗?我最初想将 MD5 哈希值存储在一个文件中,但后来我想“不,因为检查给定的 MD5 是否在这个文件中需要每次都重新读取它”。现在,我想知道:使用“在目录中创建文件”方法时是否相同?当同一目录中有很多文件时,Bash [ -f ] 是否检查线性或准常数复杂性?
如果依赖于文件系统,tmpfs 的复杂度是多少?
【问题讨论】:
-
如果文件系统变得太慢,请使用带有关联数组的 Awk。
-
对于任何体面的文件系统,我希望它大致是对数(以文件数计),但您仍然可以更快地将哈希存储在内存哈希表中。例如,如果您可以使用 Python,这将是一件微不足道的事情。
-
或者只是做
md5sum *然后比较你得到的两个文本文件。 -
@NayukiMinase MD5 可能已经足够了。对于知识渊博的对手来说,这并不安全,但是两个随机文件发生冲突的可能性仍然只有 2^128 中的 1 个,或者大约 3.4e38 中的 1 个。 (尽管如此,如果您使用的是足够快的系统,如果您极度偏执,请随意使用较慢的校验和。)
-
此外,all 散列会产生冲突,因为可能的散列空间远小于您可能想要散列的对象集。 MD5 的问题在于,有一些技术可以生成与给定文件具有相同哈希值的文件。
标签: bash time-complexity tmp tmpfs