Я хочу синхронизировать несколько источников и мне интересно, как лучше всего это сделать.
например
/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