Подскажите, как в скрипте на bash реализовать следующее:Есть два дерева файлов.
В совпадающих подкаталогах дерева могут быть файлы, являющиеся друг другу хардлинками.
Необходимо, чтобы целевое дерево стало идентичным исходному ( были созданы недостающие каталоги, удалены лишние каталоги и их содержимое. Если в совпадающих подкаталогах есть файлы с совпадающими именами, то необходимо сравнить inode файлов, если они не равны, удалить несовпавший файл и сделать хардлинк.
В результате выполнения процедуры должны получить идентичные деревья каталогов,
аналогичные тому, что получается в результатеcp -lR /data/source/* "/data/target"
После чего на них натравится rsync с ключом --delete.
Задумка состоит в том, чтобы не удалять "лишние" (устаревшие) бэкапные копии, а готовить из них новую структуру каталогов для проведения rsync "завтра", экономя на операциях создания / удаления при _огромном_ количестве сравнительно редкоменяющихся файлов.
----------
В качестве альтернативы, можно рассмотреть вариант проведения этой операции на Perl.
---
//В конечном счете планируется реализовать "внятную" систему бэкапа, которая возьмет в себя лучшие фичи систем Dirvish и Bontmia, и сможет rsync-ом бэкапить lvm-тома как девайсы, lvm-тома как файловые системы, просто файловые системы, БД MySQL (методами mysqldump/lvm-snapshot-as-device/lvm-snapshot-as-files) / Postgresql.
В сочетании с разными плюшками хранилищ с дедупликацией - может получиться очень даже и прилично =)
Всем заинтересованным в системе бэкапа предлагаю поучаствовать. Две+ головы - однозначно лучше.
> Задумка состоит в том, чтобы не удалять "лишние" (устаревшие) бэкапные копии, а
> готовить из них новую структуру каталогов для проведения rsync "завтра", экономя1. Копируешь snapshot:
cp -al <previous snapshot> <new snapshot>
2. Проходишься по новой копии:
rsync -aEAX –delete-excluded –delete –chmod=Fa-w,D+w <current directory> <new snapshot>Вообще там ещё пару телодвижений нужно сделать, чтобы было как в BackInTime: http://unspecified.wordpress.com/2010/05/19/how-backintime-w.../
>[оверквотинг удален]
>
> cp -al <previous snapshot> <new snapshot>
>
> 2. Проходишься по новой копии:
>
> rsync -aEAX –delete-excluded –delete –chmod=Fa-w,D+w <current directory>
> <new snapshot>
>
> Вообще там ещё пару телодвижений нужно сделать, чтобы было как в BackInTime:
> http://unspecified.wordpress.com/2010/05/19/how-backintime-w.../ну копировать не надо, он уже будет существовать, этот каталог.
Блин, а rsync для этих целей я заюзать и не догадался.... Совсем не в ту сторону смотрел :-)
А решение-то на поверхности... Вот жеж...
> ну копировать не надо, он уже будет существовать, этот каталог.Это не копирование, это создание хардлинков. Если будет существовать - нужно удалить. Ещё раз про алгоритм:
- создать хардлинки (cp -al)
- удалить линк на старую копию и сделать новую копию для новых файлов (rsync)Подозреваю, что --link-dest есть не во всякой версии rsync.
>> ну копировать не надо, он уже будет существовать, этот каталог.
> Это не копирование, это создание хардлинков. Если будет существовать - нужно удалить.Сам же пишешь "1. Копируешь snapshot: cp -al". Я прекрасно понимаю, что каталоги создаются, а файлы хардлинкуются. Использую "терминологию исходного сообщения".
--
Ну когда-нибудь кто-нибудь начнет внимательно читать, то что пишут в задаваемый вопрос, и пытаться это хоть чуть-чуть обдумать ????> Задумка состоит в том, чтобы не удалять "лишние" (устаревшие) бэкапные копии, а
> готовить из них новую структуру каталогов для проведения rsync "завтра", экономя
> время/операции записиТак что я в курсе про
> - создать хардлинки (cp -al)
> - удалить линк на старую копию и сделать новую копию для новых
> файлов (rsync)
> Подозреваю, что --link-dest есть не во всякой версии rsync.Надо будет проверить, и хотя мне один фиг надо будет делать собственный пакет с собственным rsync из-за --read-devices или как он там называется, для синхронизации содержимого блочного устройства в файл, но в любом случае, хочется достичь максимальной переносимости/работоспособности в любых окружениях.