Agrupando arquivos idênticos ignorando espaços e quebras de linha

2

Considere uma pasta com muitos arquivos XML (10K arquivos de texto pequenos). Alguns arquivos XML são idênticos, alguns são diferentes.

Eu gostaria de descobrir quais arquivos são idênticos ( ignorando espaços em branco, tabulações e quebras de linha ) e gravar os arquivos em cada cluster de alguma forma.

Eu não preciso de alta precisão nisso, então eu pensei que uma maneira de fazer isso seria com o MD5 ou qualquer outro algoritmo de hash, ou seja, contar o número de arquivos com a mesma soma MD5 exata, mas eu precisaria Remover espaços.

Estou no OS X e posso verificar o MD5 de um arquivo da seguinte forma:

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

Como posso usar isso para agrupar arquivos idênticos? (ou um arquivo de texto com nomes de arquivos com o mesmo hash, ou arquivos de cluster em pastas faria isso)

    
por Amelio Vazquez-Reina 06.05.2015 / 19:49

1 resposta

2

Você pode criar uma versão "normalizada" de cada arquivo XML com algo como:

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

Isso eliminaria espaços em branco "sem importância" para XML, recuo consistentemente e assim por diante. Depois disso, você pode usar cksum para encontrar arquivos normalizados idênticos.

Vou sugerir um script:

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

Não sei se me incomodaria com uma soma de verificação MD5. Você está procurando duplicatas, não fazendo criptografia com adversários malignos se opondo a você.

Se você estiver procurando por arquivos XML "quase idênticos", talvez você possa usar a Distância de compactação normalizada para ver como "distante" os arquivos são uns dos outros. Mais simplesmente, você poderia gzip ou bzip2 os arquivos XML e, em seguida, classificar com base no tamanho do arquivo compactado. Quanto mais próximo o tamanho do arquivo compactado, mais idênticos serão os arquivos XML.

    
por 06.05.2015 / 20:30