Как rsync несколько папок с исходными файлами


34

Я хочу 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

con: некоторая ручная настройка

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

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


Ответы:


33

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

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

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

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

    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
    

1
Отлично, но как сохранить структуру каталогов внутри bkp?
Родриго,

Я имею в виду, bkp / etc / fstab и bkp / home / user / dowlonad? Или, может быть, / bkp / fstab и bkp / download?
Родриго

@Rodrigo Я отредактировал свой ответ
Жиль "ТАК - перестань быть злым"

13

Мне очень нравится ответ Жиля, однако я хотел бы добавить, что, на мой взгляд, требование синхронизации нескольких папок при сохранении структуры каталогов лучше всего выполняется путем передачи нескольких исходных аргументов в сочетании с --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.


2

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

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

Как бы вы указали порт SSH с этим? Этот синтаксис действительно работает при использовании-e
tcurdt
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.