Управление конфликтами имен файлов при объединении папок (Linux)

Мне нужно что-то вроде синхронизации SW для выполнения двунаправленного (рекурсивного) объединения папок.

Скажем, у меня есть 2 папки A и B.

Папка A содержит файлы: 1, 3, 5 and 7.
Папка B содержит файлы: 1, 2, 3 and 6.

После выполнения слияния результат должен быть следующим:

Папка А: 1, 1-b, 2, 3, 3-b, 5, 6, 7
Папка Б: 1, 1-a, 2, 3, 3-a, 5, 6, 7


Разбивая их по отдельности:

обе папки A и B, содержащие: 2, 5, 6, 7
(объединение ИЛИ не конфликтующих имен файлов: двунаправленная копия (того же ранга, без конкретного источника или какого-либо конкретного места назначения) без переименования;

Папка А, содержащая также: 1, 1-b, 3, 3-b (собственные версии плюс добавленные)
Папка B, содержащая также: 1, 1-a, 3, 3-a (собственные версии плюс добавленные)
(Dash-a или dash-b - это просто заполнитель для автоматического переименования, чтобы обойти конфликт имен, не очень важно. Каждый суффикс подойдет). По сути, каждая папка будет содержать все версии (без новых, перезаписывающих старые) всех файлов, независимо от их имен.

Как я мог получить этот результат? Я посмотрел на 'meld', но не сработал, как ожидалось (он предлагал перезаписать существующие файлы, не удалось переименовать), и 'rsync' кажется по сути асимметричным (присваивая более высокий ранг источнику, чем месту назначения). Мне нужно настоящее слияния...

Заранее благодарю за любую помощь. Кстати... отдельное существующее ПО будет более ценно, чем новое изобретение горячей воды вручную. Но если ничего не существует, скрипты тоже подойдут. TY. Gatto

1 ответ

Заглянуть в info страницы для старого cp, Команда как

cp --archive --backup --suffix="-original" A/* B

Необходимо скопировать каждый файл из A в B, и если есть какие-либо уже существующие файлы (конфликтующие имена файлов), существующий файл назначения будет переименован в [name]-original (т.е. резервная копия будет сделана первой).

Затем запустите его снова, используя --no-clobber вместо --backup а также --suffix следует скопировать любые оставшиеся файлы только в B в A

cp --archive --no-clobber --exclude='*-original' B/* A

Это должно исключать [name]-original файлы в B. Убедитесь, что для этого нет файлов с этим суффиксом.

И добавить -v чтобы увидеть, что происходит.

[Пробовал - рекурсивно, но не совсем так, как ожидалось]

Другие вопросы по тегам