スペースと改行文字を無視し、同じファイルを一緒にクラスタリングします。

スペースと改行文字を無視し、同じファイルを一緒にクラスタリングします。

多くの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ファイルはより似ています。

おすすめ記事