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ą?
Odpowiedzi:
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ć):
To nie poradzi sobie z usuwaniem, ale nie jestem pewien, czy istnieje dobre rozwiązanie tego problemu polegające tylko na okresowej synchronizacji.
źródło
Czy znasz Unison File Synchronizer ?
Należy również pamiętać, że jest odporny na awarie:
źródło
Musisz uruchomić
rsync
dwa razy i polecam uruchomić go z-au
:-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ć-a
tego, 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 przypadkursync
nie zsynchronizowałby pliku, co może być fatalne.Ale potrzebujesz również,
-u
ponieważ to mówi,rsync
aby całkowicie zostawić dowolny plik / folder w spokoju, na wypadek, gdyby istniał już w miejscu docelowym i ma nowszą datę ostatniej modyfikacji. Bez-u
rsync
synchronizacji 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
rsync
wiadomo, 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,rsync
wię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ą identyczniersync
.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.
rsync
nie 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
rsync
i 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.źródło
Dzięki jsight
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
źródło
&&
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-t
opcji po opublikowaniu tej odpowiedzi.Posługiwać się
rsync <OPTIONS> [hostname:]source-dir [hostname:]dest-dir
na przykład:
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!
źródło
Używam
rsync
zinotifywait
. Gdy zmienisz dowolny plik,rsync
zostanie wykonany.Musisz uruchomić
inotifywait
na obu hostach. Sprawdź przykład inotifywaitźródło
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.
źródło
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.źródło