Shell-Script

分群相同的文件忽略空格和換行符

  • May 8, 2015

考慮一個包含許多 XML 文件(10K 小文本文件)的文件夾。有些 XML 文件是相同的,有些是不同的。

我想找出哪些文件是相同的(忽略空格、製表符和換行符)並以某種方式記錄每個集群中的文件。

我不需要高精度,所以我認為這樣做的一種方法是使用 MD5 或任何其他散列算法,即計算具有相同 MD5 總和的文件數,但我需要預先刪除空格.

我在 OS X 中,可以檢查文件的 MD5,如下所示:

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

如何使用它來分群相同的文件?(文件名具有相同雜湊值的文本文件,或者文件夾中的集群文件都可以)

您可以使用以下內容創建每個 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 文件就越相同。

引用自:https://unix.stackexchange.com/questions/201835