RSync: Jak synchronizować w obu kierunkach?

85

Chcę używać rsync do synchronizacji dwóch katalogów w obu kierunkach.

Odnoszę się do synchronizacji w klasycznym sensie ( nie tak, jak jest to rozumiane w podręcznikach rsync):
chcę aktualizować katalogi w obu kierunkach , w zależności od tego, który z nich jest nowszy .

Czy można to zrobić za pomocą rsync (najlepiej w Linuksie) ?
Jeśli nie, jakie inne rozwiązania istnieją?

java.is.for.desktop
źródło
3
Wierzę, że w serverfault.com uzyskasz lepsze odpowiedzi.
Esteban Küber

Odpowiedzi:

78

Po prostu uruchom go dwukrotnie, z trybem "nowszy" (flaga -u lub --update) plus -t (aby skopiować czas modyfikacji pliku), -r (dla folderów rekurencyjnych) i -v (dla szczegółowych danych wyjściowych, aby zobaczyć, co to jest robić):

rsync -rtuv /path/to/dir_a/* /path/to/dir_b
rsync -rtuv /path/to/dir_b/* /path/to/dir_a

To nie poradzi sobie z usuwaniem, ale nie jestem pewien, czy istnieje dobre rozwiązanie tego problemu polegające tylko na okresowej synchronizacji.

jsight
źródło
3
Ponieważ pytanie dotyczyło rsync, oznaczę tę odpowiedź jako poprawną.
java.is.for.desktop
2
Ale zapytałeś też o inne rozwiązania i Unison radzi sobie lepiej, w przeciwnym razie nigdy nie wspomniałbym o innym narzędziu. Rozumiem, że być może masz szczególne okoliczności, które sprzyjają używaniu rsync.
MaD70
1
Sheesh, masz 6 głosów za i nadal narzekasz? <j / k> Unison to naprawdę ciekawe rozwiązanie i cieszę się, że o nim wspomniałeś. :)
jsight
2
Cóż, nie narzekam, wyjaśniam. Tylko po to, żeby sprawdzić, czy czegoś mi nie brakuje (nie jestem native speakerem).
MaD70
1
MaD70 - Nie ma problemu ... tylko żartowałem. :)
jsight
64

Czy znasz Unison File Synchronizer ?

Unison to narzędzie do synchronizacji plików dla systemów Unix i Windows. Umożliwia przechowywanie dwóch replik zbioru plików i katalogów na różnych hostach (lub różnych dyskach na tym samym hoście), osobne modyfikowanie, a następnie aktualizowanie poprzez propagowanie zmian w każdej replice do drugiej. ...

Należy również pamiętać, że jest odporny na awarie:

Unison jest odporny na awarie. Uważa, aby przez cały czas pozostawić repliki i własne struktury prywatne w rozsądnym stanie, nawet w przypadku nieprawidłowego zakończenia lub awarii komunikacji.

MaD70
źródło
3
+1. Unison to najlepszy sposób na zrobienie tego. Podwójna rsync jest trudna do uzyskania i w ogóle nie obsługuje usuwania.
Avdi
Tak, Unison jest odporny na błędy. Aktualizuję odpowiedź, aby to podkreślić.
MaD70
6
Nie słyszałem o Unison. Jesteś dziś odpowiedzialny za zmuszenie mnie do ponownego wykonania kopii zapasowych skryptów w domu.
Esteban Küber
1
Cieszę się, że moja odpowiedź jest tak przydatna (to pokazuje, jak praktyczne może być narzędzie oparte na solidnych podstawach teoretycznych).
MaD70
Oto krótki samouczek dotyczący Unison w linuxjournal.
lepe
14

Musisz uruchomić rsyncdwa razy i polecam uruchomić go z -au:

rsync -au /local/source/* /remote/destination
rsync -au /remote/destination/* /local/source

-a(a jak archiwum) to skrót do -rlptgoD:

  • -r Powtarzaj w podkatalogach
  • -l Synchronizuj także dowiązania symboliczne
  • -p Synchronizuj także uprawnienia do plików
  • -t Synchronizuj także czasy modyfikacji plików
  • -g Synchronizuj także grupy plików
  • -o Synchronizuj także właściciela pliku
  • -D Synchronizuj również pliki specjalne (nie zwykłe / meta)

Zasadniczo za każdym razem, gdy chcesz utworzyć identyczną kopię jeden do jednego przy użyciu rsync, powinieneś zawsze używać -atego, ponieważ tego oczekuje większość użytkowników, gdy mówią o „ synchronizacji ”. Inne odpowiedzi wydają się pomijać fakt, że czasami zawartość pliku pozostaje niezmieniona, ale jego właściciel mógł się zmienić lub jego uprawnienia dostępu mogły się zmienić iw takim przypadku rsyncnie zsynchronizowałby pliku, co może być fatalne.

Ale potrzebujesz również, -uponieważ to mówi, rsyncaby całkowicie zostawić dowolny plik / folder w spokoju, na wypadek, gdyby istniał już w miejscu docelowym i ma nowszą datę ostatniej modyfikacji. Bez -u rsyncsynchronizacji niezależnie od tego, czy plik / folder jest nowszy, czy nie .

Należy pamiętać, że to rozwiązanie nie obsługuje usuniętych plików. Obsługa usuwania nie jest łatwa, biorąc pod uwagę następującą sytuację: plik został usunięty u źródła, teraz skąd rsyncwiadomo, czy ten plik kiedyś istniał i został usunięty (w takim przypadku należy go również usunąć w miejscu docelowym) lub czy nigdy nie istniał u źródła (w takim przypadku musi zostać skopiowany z miejsca docelowego). Te dwie sytuacje wyglądają identycznie, rsyncwięc nie może wiedzieć, jak prawidłowo zareagować. Synchronizacja w drugą stronę nie pomoże, ponieważ może to doprowadzić do tej samej sytuacji: plik istnieje w źródle, ale nie w miejscu docelowym. Czemu? Czy nigdy nie istniał w miejscu docelowym, czy został usunięty? Oba przypadki wyglądają identycznie rsync.

Narzędzia do synchronizacji, które mogą niezawodnie synchronizować usunięte pliki, zwykle zarządzają dziennikiem synchronizacji o wszystkich wcześniejszych operacjach synchronizacji. Jeśli ten dziennik ujawni, że kiedyś istniał plik i został zsynchronizowany, ale teraz go brakuje, jasne jest, że został usunięty. Jeśli według dziennika nigdy nie było takiego pliku, należy go zsynchronizować. Przechowując wszystkie wpisy dziennika z sygnaturami czasowymi, jest nawet możliwe, że usunięty plik powróci i zostanie usunięty wiele razy, ale narzędzie do synchronizacji zawsze wie, co zrobić, a wynik jest zawsze poprawny. rsyncnie ma takiego dziennika, opiera się tylko na bieżącym stanie pliku po obu stronach operacji.

Możesz jednak zbudować sobie polecenie synchronizacji używając rsynci trochę skryptów powłoki POSIX, które są już bardzo zbliżone do narzędzia do synchronizacji, jak opisano powyżej. Ponieważ sam potrzebowałem takiego narzędzia, oto odpowiedź na Stackoverflow, która poprowadzi Cię przez tworzenie takiego skryptu.

Mecki
źródło
Pięknie ujęty.
Peter Rowntree
6

Dzięki jsight

rsync -urv --progress dir_a dir_b && rsync -urv  --progress dir_b dir_a

Spowodowałoby to, że druga synchronizacja miałaby miejsce natychmiast po zakończeniu pierwszej synchronizacji. W przypadku, gdy struktura katalogów jest ogromna, pozwoli to zaoszczędzić czas, ponieważ nie trzeba siedzieć przed komputerem. Jeśli struktura jest ogromna, usuń informacje szczegółowe i postęp

rsync -ur dir_a dir_b && rsync -ur dir_b dir_a
Mayank Agarwal
źródło
1
Zastanawiam się tylko, czy powinienem dodać -t, aby skopiować czas modyfikacji pliku. Czy jest powód, dla którego powinienem pominąć tę opcję?
chrips
@Chrips Nie, nie sądzę. Wydaje się, że celem tej odpowiedzi było po prostu pokazanie, że można użyć &&między dwoma poleceniami, aby automatycznie uruchomić 2. polecenie natychmiast po 1. poleceniu (jeśli 1. polecenie się powiedzie), w przeciwieństwie do ręcznego uruchamiania jednego po drugim, jak w odpowiedzi @ jsight. Wydaje mi się również, że odpowiedź @ jsight została zmieniona w celu uwzględnienia -topcji po opublikowaniu tej odpowiedzi.
Ruben9922
1

Posługiwać się rsync <OPTIONS> [hostname:]source-dir [hostname:]dest-dir

na przykład:

rsync -pogtEtvr --progress --bwlimit=2000 xxx-files different-stuff

Zsynchronizuje pliki-xxx z różnymi-rzeczami / plikami-xxx. Jeśli różne-rzeczy / pliki-xxx nie istniały, utworzy je - tj. Skopiuje.

-pogtEtv - tylko kilka opcji zachowania metadanych plików, plus v - verbose i r - recursive

--progress - pokaż postęp synchronizacji w czasie rzeczywistym - bardzo przydatne, jeśli kopiujesz duże pliki

--bwlimit=2000 - ustawia maksymalną prędkość kopiowania / synchronizacji (bw = przepustowość)

PS rsync jest niezwykle ważne, gdy pracujesz w sieci, w przypadku lokalnego komputera możesz używać poleceń takich jak cp .

Powodzenia!

Bohdan
źródło
0

Używam rsyncz inotifywait. Gdy zmienisz dowolny plik, rsynczostanie wykonany.

inotifywait -m --exclude "$_LOG_FILE" -r -e create,delete,delete_self,modify,moved_to --format "%w%f" "$folder"

Musisz uruchomić inotifywaitna obu hostach. Sprawdź przykład inotifywait

Dodaję
źródło
0

Potrzebujesz Rclone . Rclone („rsync do przechowywania w chmurze”) to program linuksowy wiersza poleceń do synchronizowania plików i katalogów z różnymi dostawcami pamięci masowej w chmurze (skrzynka, dropbox, ftp itp.) Oraz lokalnymi systemami plików. Rlone obsługuje tylko synchronizację lustrzaną.

Innym bardziej graficznym rozwiązaniem, które obejmuje synchronizację w czasie rzeczywistym, byłoby użycie FreeFileSync , który zawiera program RealTimeSync. FreefileSync obsługuje dwukierunkową synchronizację dwukierunkową, która obejmuje obsługę usuwania.

FreFileSync gui

user1461607
źródło
0

Miałem to samo pytanie i ostatecznie korzystałem git. Może to nie pasować do twojej sytuacji, ale jeśli ktoś znajdzie ten temat i ma to samo pytanie, możesz rozważyć system kontroli wersji.

sgon00
źródło