Какие алгоритмы или библиотеки Java доступны для N-way, рекурсивного сравнения / слияния каталогов?
Мне нужно иметь возможность генерировать список деревьев папок, которые имеют много одинаковых файлов и имеют подкаталоги со многими похожими файлами. Я хочу использовать двухсторонние операции слияния, чтобы быстро удалить как можно больше избыточности.
Цели:
- Найдите пары каталогов, в которых много похожих файлов.
- Создание короткого списка пар каталогов, которые могут быть синхронизированы с двухсторонним объединением для устранения дубликатов
- Должен работать рекурсивно (могут быть вложенные дубликаты каталогов верхнего уровня)
- Время выполнения и память должны быть O (n log n) в количестве каталогов и файлов
- Должен иметь возможность использовать встроенную БД или страницу на диск для обработки большего количества файлов, чем умещается в памяти (более 100 000 +).
- Необязательно: создать происхождение и набор изменений между папками
- Необязательно: сортируйте операции слияния по количеству дубликатов, которые они могут увеличить
Я знаю, как использовать хэши, чтобы находить дубликаты файлов примерно в O (n) пространстве, но я не знаю, как перейти к поиску частично перекрывающихся наборов между папками и их дочерними элементами.
РЕДАКТИРОВАТЬ: некоторые уточнения
Сложность заключается в разнице между «точно одинаковым» содержимым (иначе хэши файлов будут работать) и «похожим» (что не будет). По сути, я хочу передать этот алгоритм в набор каталогов и заставить его возвращать набор двухсторонних операций слияния, которые я могу выполнить, чтобы максимально сократить количество дубликатов при минимальном количестве возможных конфликтов. Это эффективно создает дерево предков, показывающее, какие папки являются производными друг от друга.
Конечная цель - позволить мне объединить несколько разных папок в одно общее дерево. Например, у меня может быть папка с проектами программирования, а затем скопировать часть ее содержимого на другой компьютер для работы на нем. Тогда я мог бы сделать резервную копию и промежуточную версию на флешку. За исключением того, что у меня может быть 8 или 10 разных версий, с немного разными организационными структурами или именами папок. Мне нужно иметь возможность объединять их по одному шагу за раз, чтобы я мог выбирать, как включать изменения на каждом этапе пути.
Это на самом деле более или менее то, что я собираюсь сделать с моей утилитой (собрать кучу разрозненных резервных копий из разных моментов времени). Я полагаю, что если я могу сделать это правильно, я могу также выпустить его как небольшую утилиту с открытым исходным кодом. Я думаю, что те же самые хитрости могут быть полезны для сравнения деревьев XML.