Кластеризация идентичных файлов, игнорирующих пробелы и разрывы строк

Рассмотрим папку со многими 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-файлы, возможно, вы можете использовать Normalized Compression Distance, чтобы увидеть, как «далеко друг от друга» находятся файлы друг от друга. Более просто, вы могли бы gzip или bzip2 XML-файлы, а затем сортировать на основе сжатого размера файла. Чем ближе размер сжатого файла, тем более идентичны файлы XML.