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

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

Я хочу синхронизировать несколько источников и мне интересно, как лучше всего это сделать.

например

/etc/fstab
/home/user/download

Я думал о 3 решениях:

  • Решение 1

множественный вызов rsync

rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp

минус: сложнее получить агрегированную статистику

  • Решение 2

создайте tobackupпапку, содержащую символическую ссылку, и используйте -Lпараметры

sync -aL /home/user/tobackup bkp

con : содержимое для резервного копирования не должно содержать символических ссылок

  • Решение 3

переместить файлы в резервную копию и создать символическую ссылку в исходном месте

rsync -a /home/user/tobackup bkp

минусы: некоторая ручная настройка

Какой из них вы рекомендуете?

Есть ли способ лучше ?

решение1

Вы можете передать несколько исходных аргументов.

rsync -a /etc/fstab /home/user/download bkp

Это создает bkp/fstabи bkp/download, как отдельные команды, которые вы дали. Может быть, будет желательно сохранить исходную структуру вместо этого. Чтобы сделать это, используйте /в качестве источника и используйтеправила включения-исключениячтобы указать, какие файлы копировать. Есть два способа сделать это:

  • Явно укажите каждый файл, а также каждый компонент каталога, ведущий к нему, /***в конце каталогов, если вы хотите скопировать все дерево каталогов:

    rsync -a \
        --include=/etc --include=/etc/fstab \
        --include=/home --include=/home/user --include='/home/user/download/***' \
        --exclude='*' / bkp
    
  • Включить все каталоги верхнего уровня с /*/(чтобы rsync обошел /etcи /homeпри поиске файлов для копирования) и каталоги второго уровня с /*/*/(для /home/user), но удалить каталоги, в которые не копируются файлы. Это удобнее, поскольку вам не нужно явно перечислять родителей. Вы даже можете использовать --prune-empty-dirs --include='*/'вместо подсчета количества уровней, но в данном случае это непрактично, так как rsync обойдет всю файловую систему для исследования каталогов, хотя ни одно из правил включения не может соответствовать ничему за пределами /etcи /home/user/download.

    rsync -a --prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    

решение2

Мне очень нравится ответ Жиля, однако я хотел бы добавить, что, по моему мнению, требование синхронизации нескольких папок с сохранением структуры каталогов лучше всего выполняется путем передачи нескольких исходных аргументов вместе с опцией --relative.

В этом случае мы могли бы иметь что-то вроде этого:

rsync -aR /etc/fstab /home/user/download bkp

что приведет к bkp/etc/fstabи bkp/home/user/download.

Самое лучшее в этом то, что (я полагаю, начиная с rsync v. 2.6.7) мы можем по сути контролировать, какую часть структуры каталогов мы хотим реплицировать в месте назначения.
(См. документацию по --relativeопцииздесь)

Так, например, если бы мы сделали это

rsync -aR /home/./user1/download /home/./user2/download bkp

мы бы в итоге получили bkp/user1/downloadи bkp/user2/download.

решение3

Это тоже работает — фигурные скобки, содержащие список источников, разделенных запятыми.

rsync -vap --progress --stats root@server:{/etc,/root/backups,/home/ultralazer} /mnt/bigdrive

Немного похоже на то, что происходит при вызове фигурных скобок sytnax с помощью cp и некоторых других утилит:

cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive

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