Shell-Script
分群相同的文件忽略空格和換行符
考慮一個包含許多 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 文件,您可以使用標準化壓縮距離來查看文件彼此之間的“距離”。更簡單地說,您可以
gzip
或bzip2
XML 文件,然後根據壓縮文件的大小進行排序。壓縮文件大小越接近,XML 文件就越相同。