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

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

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

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

Папка A: 1, 1-b, 2, 3, 3-b, 5, 6, 7
Папка B: 1, 1-a, 2, 3, 3-a, 5, 6, 7


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

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

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

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

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

1 ответ1

0

Посмотрите на 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 чтобы увидеть, что происходит.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .