Як 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: деякий посібник config

Який ти рекомендуєш?

Чи є кращий спосіб?


Відповіді:


33

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

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шукав файли для копіювання) та каталоги другого рівня з /*/*/(for /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 / завантажити?
Родріго

@Rodrigo Я відредагував свою відповідь
"SO- перестань бути злим"

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.