将相同的文件聚集在一起,忽略空格和换行符

将相同的文件聚集在一起,忽略空格和换行符

考虑一个包含许多 XML 文件(10K 小文本文件)的文件夹。有些 XML 文件是相同的,有些是不同的。

我想找出哪些文件是相同的(忽略空格、制表符和换行符)并以某种方式记录每个簇中的文件。

我不需要高精度,所以我认为一种方法是使用 MD5 或任何其他哈希算法,即计算具有相同精确 MD5 总和的文件数量,但我需要预先删除空格。

我在 OS X 中,可以按如下方式检查文件的 MD5:

$ md5 file_XYZ.xml
MD5 (file_XYZ.xml) = 0de0c7bea1a75434934c3821dcba759a

我如何使用它来集群相同的文件? (文件名具有相同哈希值的文本文件或文件夹中的集群文件都可以做到这一点)

答案1

您可以使用以下内容创建每个 XML 文件的“规范化”版本:

xmllint --nospace --format orginal.xml > normalized.xml

这将消除对 XML 来说“不重要”的空格、一致的缩进等等。之后,您可以用来cksum查找相同的归一化文件。

我会建议一个脚本:

for ORIGXML in *.xml
do
    xmllint --noblank --format "$ORIGXML" > "normalized.$ORIGXML"
    cksum "normalized.$ORIGXML" | sed 's/^normalized\.//' >> files.list
done
sort -k1.1 files.list > sorted.files

我不确定是否需要 MD5 校验和。你正在寻找重复的东西,而不是与反对你的邪恶对手一起进行密码学。

如果您正在寻找“几乎相同”的 XML 文件,您可以使用归一化压缩距离查看文件彼此之间的“距离”有多远。更简单地说,您可以gzipbzip2XML 文件进行排序,然后根据压缩文件的大小进行排序。压缩文件大小越接近,XML 文件就越相似。

相关内容