我有一个目录结构,我知道其中包含很多重复文件。 (目录树有 67K 个文件,其中大约有 8K 个重复项)。当然,重复项的字节大小和内容相同,但文件名完全不同。当使用 fdupes /dir/path -rm 时,我只得到 125 个重复项。但是,如果我将整个目录树内容的 SHA256 转储到文本文件中:
input_dir=$1
IFS=$'\n'
for i in $(find ${input_dir} -type f); do
sha256sum "${i}" >> dupfilenames.txt
done
然后 grep 查找重复的 SHA256 签名:
cat dupfilenames.txt | cut -d " " -f1 | sort | uniq | while read sha; do
count=`cat dupfilenames.txt | grep ${sha} | wc -l`
if [ $count -gt 1 ]; then
echo "${sha}:${count}"
IFS=$'\n'
files=( $(cat dupfilenames.txt | grep ${sha} | cut -d " " -f3) );
orig_size=`stat -c%s "${files[0]}"`
for i in "${files[@]:1}"; do
if [ $orig_size -eq `stat -c%s "${i}"` ]; then
echo "Origsize:${orig_size} vs. `stat -c%s "${i}"` '${i}'"
else
echo "SHA matches but filesize doesn't for '${i}'!!!"
fi
done
fi
done
代码执行后,我得到了大约 8000 个重复签名。
这是由于 fdupes 使用的 MD5 签名不足造成的吗? (我知道我有超过 125 个文件,它们的内容完全相同,更不用说逐字节的文件大小了。
答案1
好吧,我想通了 - 如果没有给出显式开关( -H ), fdupes 将忽略硬链接文件。这就是重复文件数量差异的原因。当使用 -H 开关运行时,重复项的数量与我上面引用的代码产生的相同。