Мой сценарий выглядит примерно так:
cp -al $yesterdays_snapshot $todays_snapshot
rsync -vadlH --exclude-from excludes.rsyc $source $todays_snapshot
Это отлично работает, за исключением одной проблемы:
Если вчера у меня не было исключений, но сегодня я понимаю, что / directory / cache следует исключить, rsync перестает просматривать кеш, но cp продолжает копировать его вперед каждый день. Через некоторое время это означает, что снимки будут иметь содержимое / directory / cache годичной давности, что нежелательно. Нам вообще не нужен / directory / cache в снимке.
Было бы лучше, если бы rsync удалил / directory / cache из новейшего снимка.
В качестве альтернативы было бы хорошо, если бы cp знал, что не следует копировать файлы, перечисленные в excludes.rsync.
Я могу написать функцию, которая вручную удаляет любые исключаемые файлы из todays_snapshot, но для этого потребуется немного взлома, и это похоже на проблему, на которую есть готовый ответ.
Какие-либо предложения?
То, что вы пытаетесь сделать с помощью cp и rsync, - это создать наборы резервных копий с идентичными файлами, жестко связанными друг с другом.
Это может быть очень полезно, поэтому разработчики rsync уже обдумали это и включили встроенные функции непосредственно в rsync для достижения этой цели.
Эта функциональность предоставляется --link-dest
вариант.
В основном ваша команда rsync будет выглядеть так rsync -va sourcepath newsnapshotpath --link-dest previoussnapshot
. Rsync жестко свяжет любые идентичные файлы с предыдущим снимком и при необходимости скопирует новые файлы. Файлы, которых больше нет в источнике, не будут связаны / скопированы.
В моем ответе на еще вопрос я показал серию команд вы могли бы посмотреть, как именно все это работает.
Для справки: если вы не хотите заново изобретать колесо, вам стоит обратить внимание на dirvish. Это резервная копия, специально разработанная для использования --link-dest
характерная черта.