Использование rsync для сохранения копии каталога с изменяющимся именем

Использование rsync для сохранения копии каталога с изменяющимся именем

Я использую rsync в системе Linux для синхронизации каталога между локальным диском и подключенным USB-накопителем. Проблема, с которой я столкнулся, заключается в том, что сторонняя система, которая ежедневно создает резервную копию на сервере, на самом деле изменяет имя каталога, вложенного глубоко в резервную копию. В этом каталоге находится большинство данных, необходимых для резервной копии. Когда rsync просматривает каталог, он видит, что имя изменилось, и считает его совершенно новым каталогом. Поэтому моя копия rsync на USB-накопителе имеет новый каталог для каждого дня, когда она запускается.

Я написал скрипты, которые фактически меняют имя каталога обратно, но это слишком громоздкий способ сделать это!

Я ищу "элегантный" способ справиться с этим. Возможно ли создать ссылку на каталог, которая останется постоянной? Можно ли настроить rsync так, чтобы он определял, что каталог тот же самый, даже если имя изменилось? Я уверен, что кто-то уже сталкивался с этим!

решение1

Один из подходов — сделать это в два этапа. Во-первых, синхронизировать с помощью rsync все, кроме нужного каталога, используя шаблоны игнорирования. Во-вторых, синхронизировать с помощью rsync только каталог, используя подстановку в bash, чтобы добраться до каталога, например:

rsync -av /usr/lib/mydata/bigdatadir*/ /mnt/usbvolume/bigdatadir/

Использование завершающего слеша в исходном каталоге фактически заставит rsync игнорировать имя каталога, поскольку он будет вызван насодержаниекаталога, а не самого каталога. Конечно, этот глоббинг будет проще всего, если каталог назван с постоянным префиксом или суффиксом, как в моем примере выше. Если это не так, вы можете написать скрипт, чтобы выяснить фактическое имя каталога, и сделать что-то более прямолинейное, например:

rsync -av /usr/lib/mydata/$BIGDATADIRNAME/ /mnt/usbvolume/bigdatadir/

В конечном итоге ваш псевдокод будет выглядеть примерно так:

  1. Найти $BIGDATADIRNAME
  2. Выполните rsync, все как и раньше, но игнорируйте $BIGDATADIRNAME
  3. Rsync-этосодержаниеиз $BIGDATADIRNAME

решение2

Вы можете использовать параметры rsync--compare-dest=КАТАЛОГ,--copy-dest=КАТАЛОГ, или--link-dest=КАТАЛОГ. Они позволяют указать дополнительный каталог на принимающей стороне для поиска отсутствующих файлов.

Например, при использовании параметра --link-dest rsync создаст новую версию каталога, содержащую новые копии файлов, которые были изменены, или жестко связанные копии файлов, которые не были изменены.

Чтобы использовать любой из этих вариантов, вам нужно знать имя каталога на USB-накопителе из предыдущего запуска rsync, поэтому вам, вероятно, захочется обернуть rsync в скрипт, который сначала вычислит правильное имя каталога.

Вы также можете использовать --delete-after для удаления старых версий каталога после создания новой версии.

решение3

Rsync сам по себе не может сделать то, что вам нужно, поскольку единственные метаданные, доступные rsync, — это имя каталога и MACtimes.

Единственный способ автоматически обрабатывать это внутри rsync — каким-то образом добавить rsync больше метаданных. Например, репликация DFS от Microsoft в Windows обрабатывает это, используя уникальный идентификатор, назначенный файлам в томе NTFS, чтобы отследить, когда имя файла (или каталога) меняется.

Ваш неэлегантный скрипт, вероятно, является самым простым способом сделать то, что вам нужно, не отказываясь от rsync и не ища другой инструмент.

Использование символической ссылки не сработает, поскольку точка соединения привязана к имени целевого каталога (и имя целевого каталога в этом случае будет меняться). Вы можете использовать жесткую ссылку (которая привязана к иноду), но вам нужно быть уверенным, что имя каталога меняется, а не просто удаляется и создается заново (что назначит ему другой инод).

Связанный контент