Jak zsynchronizować wiele folderów źródłowych

34

Chcę zsynchronizować wiele źródeł i zastanawiam się, jak najlepiej to osiągnąć.

na przykład

/etc/fstab
/home/user/download

Myślałem o 3 rozwiązaniach:

  • Rozwiązanie 1

wielokrotne połączenie z rsync

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

con: trudniej mieć agregowane statystyki

  • Rozwiązanie 2

utwórz tobackupfolder zawierający dowiązanie symboliczne i użyj -Lopcji

sync -aL /home/user/tobackup bkp

con: treść do kopii zapasowej nie może zawierać dowiązań symbolicznych

  • Rozwiązanie 3

przenieś pliki do kopii zapasowej i utwórz dowiązanie symboliczne w oryginalnej lokalizacji

rsync -a /home/user/tobackup bkp

con: trochę ręcznej konfiguracji

Który polecasz?

Czy jest lepszy sposób?

użytkownik1437346
źródło
zdalne źródło: stackoverflow.com/questions/15817583/...
Ciro Santilli 13 改造 中心 法轮功 六四 事件

Odpowiedzi:

33

Możesz przekazać wiele argumentów źródłowych.

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

To tworzy bkp/fstabi bkp/download, podobnie jak osobne polecenia, które wydałeś. Zamiast tego może być pożądane zachowanie struktury źródłowej. Aby to zrobić, użyj /jako źródła i użyj reguł włącz / wyłącz, aby określić, które pliki mają zostać skopiowane. Można to zrobić na dwa sposoby:

  • Jawnie dołącz każdy plik, a także każdy składnik katalogu prowadzący do niego, /***na końcu katalogów, gdy chcesz skopiować całe drzewo katalogów:

    rsync -a \
        --include=/etc --include=/etc/fstab \
        --include=/home --include=/home/user --include='/home/user/download/***' \
        --exclude='*' / bkp
    
  • Uwzględnij wszystkie katalogi najwyższego poziomu za pomocą /*/(aby rsync przechodził /etci /homepodczas szukania plików do skopiowania) i katalogi drugiego poziomu za pomocą /*/*/(dla /home/user), ale usuwaj katalogi, w których żaden plik nie jest kopiowany. Jest to wygodniejsze, ponieważ nie musisz jawnie wymieniać rodziców. Możesz nawet użyć --prune-empty-dirs --include='*/'zamiast zliczania poziomów, ale jest to tutaj niepraktyczne, ponieważ rsync przeglądałby cały system plików w celu eksplorowania katalogów, nawet jeśli żadna z reguł dołączania nie pasuje do niczego poza /etci /home/user/download.

    rsync -a --prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    
Gilles „SO- przestań być zły”
źródło
1
Świetnie, ale jak utrzymać strukturę katalogów wewnątrz BKP?
Rodrigo
Mam na myśli, bkp / etc / fstab i bkp / home / user / dowlonad? A może / bkp / fstab i bkp / download?
Rodrigo
@Rodrigo Zredagowałem swoją odpowiedź
Gilles „SO- przestań być zły”
13

Naprawdę podoba mi się odpowiedź Gillesa, chciałbym jednak dodać, że moim zdaniem wymóg synchronizacji wielu folderów przy jednoczesnym zachowaniu struktury katalogów najlepiej jest spełnić, przekazując wiele argumentów źródłowych w połączeniu z --relative opcją.

W takim przypadku możemy mieć coś takiego:

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

co spowodowałoby bkp/etc/fstabibkp/home/user/download .

Najlepszą częścią tego jest to, że (uważam od rsync v. 2.6.7) możemy w zasadzie kontrolować, ile struktur katalogów chcemy powielić w odbiorniku.
(Zobacz dokumentację --relativeopcji tutaj )

Więc np. Gdybyśmy to zrobili

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

skończylibyśmy na bkp/user1/downloadi bkp/user2/download.

Christoph
źródło
2

Działa to również - nawiasy klamrowe, zawierające listę źródeł oddzieloną przecinkami.

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

Nieco podobne do tego, co dzieje się, gdy wywołujesz nawiasy klamrowe sytnax za pomocą cp i niektórych innych narzędzi:

cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive
Brad Hein
źródło
Jak określisz port ssh za pomocą tego? Ta składnia wydaje się działać, gdy używasz-e
tcurdt