多くの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ファイルを探している場合は、次のものを使用できます。標準化された圧縮距離ファイルが互いにどれだけ離れているか確認してください。より簡単には、XMLファイルをgzip
ソートbzip2
してから、圧縮ファイルのサイズに基づいてソートすることができます。圧縮されたファイルサイズが近いほど、XMLファイルはより似ています。