Dwukierunkowa synchronizacja z rsync

95

Mam folder a / i folder zdalny A /. Teraz uruchamiam coś takiego na pliku Makefile:

get-music:
 rsync -avzru server:/media/10001/music/ /media/Incoming/music/

put-music:
 rsync -avzru /media/Incoming/music/ server:/media/10001/music/

sync-music: get-music put-music

kiedy tworzę muzykę do synchronizacji, najpierw pobiera wszystkie różnice z serwera na lokalny, a następnie odwrotnie, wysyłając wszystkie różnice z lokalnego na serwer.

Działa to bardzo dobrze tylko wtedy, gdy w przyszłości są tylko aktualizacje lub nowe pliki. Jeśli są skreślenia, to nic nie robi.

W rsync są opcje --delete i --delete-after, które pomagają osiągnąć to, co chcę, ale rzecz jest taka, że ​​nie działa przy synchronizacji dwukierunkowej.

Jeśli chcę usunąć pliki serwera na synchronizacji, gdy pliki lokalne zostały usunięte, działa, ale jeśli z jakiegoś powodu (wyjaśnione poniżej) mam pliki, których nie ma na serwerze, ale istnieją lokalnie i zostały usunięte, Chcę je lokalnie usunąć, a nie skopiować na serwer (tak się dzieje).

Chodzi o to, że mam 3 maszyny w kontekście:

  1. pulpit
  2. notatnik
  3. serwer domowy

Dlatego czasami serwer będzie miał pliki, które zostały usunięte podczas synchronizacji notatnika, a następnie, kiedy uruchomię synchronizację z moim komputerem (gdzie usunięte pliki serwera nadal istnieją), chcę, aby te pliki zostały usunięte, a nie skopiowany ponownie na serwer.

Myślę, że jest to możliwe tylko z bazą danych i śledzeniem operacji: P

Jakieś prostsze rozwiązania? Dziękuję Ci.

mwm
źródło
1
Mam ten sam problem. Znalazłeś rozwiązanie, mwm?
mouche
7
teraz to zrobiłem. Próbowałem osiągnąć doświadczenie podobne do dropboxa i wymyśliłem rozwiązanie, które obejmuje unison (które używa rsync) i lsyncd do monitorowania zmian plików. znalazłem też inne osoby z tym rozwiązaniem i więcej sztuczek na górze » cerebralmastication.com/2011/04/fast-two-way-sync-in-ubuntu
mwm
obecnie używam nextcloud lokalnie na moim serwerze domowym. doskonałe rozwiązanie „dropbox” w 100% zarządzane przeze mnie. ma klientów z systemem Android / ios / win / macos / linux / web.
mwm

Odpowiedzi:

63

Wypróbuj Unison: http://www.cis.upenn.edu/~bcpierce/unison/

Składnia: unison dirA/ dirB/

Unison pyta, co zrobić, gdy pliki są różne, ale możesz zautomatyzować ten proces, używając następujących opcji, które akceptują domyślne (niesprzeczne) opcje:

unison -auto dirA/ dirB/

unison -batch dirA/ dirB/ nie zadaje żadnych pytań i wypisuje, ile plików zostało zignorowanych (ponieważ były w konflikcie).

Alex
źródło
7
Unison jest dość łatwy w użyciu dla małych katalogów. Ale jest potwornie WOLNY w przypadku katalogów z dużą liczbą plików. Podczas gdy rsync zacznie kopiować prawie od razu, unison czasami zajmuje ponad 12 godzin, aby rozpocząć kopiowanie, ponieważ skanuje każdy plik przed skopiowaniem czegokolwiek.
Brent Faust
1
Git jest w tym dobry? Przynajmniej git jest łatwy w użyciu, a transport szybki. Dla bloba istnieje rozszerzenie opracowane przez github o nazwie Large File Storage .
wener
1
Główne problemy gita to duże pliki i to, że jest on naprawdę zaprojektowany do jawnych zatwierdzeń. Oba można w znaczny sposób ulepszyć za pomocą dodatków, takich jak git-Annex, duża pamięć plików itp.
alex
3
@wener Nie używaj młotka do wkręcania śrub ani śrubokręta do gwoździa. :)
ADTC
3
unison jest świetny - ale także bardzo zawodny. W około 50% przypadków po prostu nie zadziałało. Najczęstszą tego przyczyną są słabe możliwości między wersjami. Czasami synchronizuję się z zawartością na komputerze, do którego nie mam uprawnień. Jeśli ten serwer ma inną wersję niż ja, unison się nie powiedzie. Ponadto ostatnio miałem awarię między klientami unison tej samej wersji, ponieważ używali różnych skompilowanych wersji pewnej biblioteki (było to między komputerem ubuntu a malinowym pi).
argentum2f
5

Możesz użyć Osync: http://www.netpower.fr/osync , który jest oparty na rsync z inteligentną propagacją usuwania. ma również wiele opcji, takich jak wznawianie zatrzymanego wykonywania, miękkie usuwanie i kontrola czasu.

Orsiris de Jong
źródło
5

Ponieważ pierwotne pytanie dotyczy również komputera stacjonarnego i laptopa oraz przykładu z plikami muzycznymi (stąd prawdopodobnie używa GUI), wspomniałbym również o jednym z najlepszych dwukierunkowych, wieloplatformowych, bezpłatnych i otwartych programów do tej pory: FreeFileSync .

Oparty na graficznym interfejsie użytkownika, bardzo szybki i intuicyjny, zawiera filtrowanie i wiele innych opcji, w tym możliwość zdalnego łączenia się, przeglądania i interaktywnego zarządzania „kolizjami” (na przykład plików z podobnymi sygnaturami czasowymi) oraz przełączania między transferami dwukierunkowymi, dublowaniem wkrótce.

Dario Fumagalli
źródło
4

Spróbuj tego,

get-music:
 rsync -avzru --delete-excluded server:/media/10001/music/ /media/Incoming/music/

put-music:
 rsync -avzru --delete-excluded /media/Incoming/music/ server:/media/10001/music/

sync-music: get-music put-music

Po prostu to testuję i zadziałało. Robię dwukierunkową synchronizację pomiędzy Windows7 (używając cygwin z zainstalowanym pakietem rsync) a serwerem plików FreeNAS (FreeNAS działa na FreeBSD z preinstalowanym pakietem rsync).

Chris Collins
źródło
3
Czy to nie spowoduje usunięcia nowych plików lokalnych? -upomija pliki nowsze w miejscu docelowym, ale rsync nie ma sposobu śledzenia wieku usunięcia, więc jak ten skrypt może rozróżnić, kiedy plik lokalny jest nowy (i powinien zostać zachowany) lub stary (i powinien zostać usunięty) ? A może nie rozumiem?
Matthemattics
Czy --delete-excludedusuwa wszystkie pliki, które istnieją w katalogach docelowych, ale nie w katalogach źródłowych? Myślałem, że musisz zdefiniować, --exclude=<filename>więc czy rsync nie usunie tylko tych wykluczeń? A może rsync traktuje wszystkie pliki katalogów niebędące źródłami jako „wykluczenia”?
Mr_Moneybags
2
Znaleziono odpowiedź: Oprócz usunięcia plików po stronie odbierającej, które nie znajdują się po stronie wysyłającej, program rsync powinien również usunąć wszystkie wykluczone pliki po stronie odbiorczej (patrz --exclude) rsync.samba.org/ftp /rsync/rsync.html
Mr_Moneybags,
2
Z tego, co rozumiem, jeśli utworzę plik w miejscu docelowym, a następnie wykonam polecenie rsync w celu skopiowania ze źródła do miejsca docelowego, usunie plik w miejscu docelowym, ponieważ nie są używane znaczniki czasu. To nie jest to, czego chcesz, prawda?
elexhobby
10
@ Lübnah: dobrze; to rozwiązanie nie jest pełną dwukierunkową synchronizacją : ponieważ rsync with --delete-excludedjest uruchamiany z serwerem jako źródłem w pierwszej kolejności: pliki dodane lokalnie zostaną usunięte podczas tego uruchomienia (podczas gdy pliki dodane do serwera kopiowane do lokalnego miejsca docelowego). Jedynymi plikami lokalnymi zsynchronizowanymi z powrotem z serwerem są pliki, które również istnieją na serwerze i zostały zmodyfikowane lokalnie (później niż wersje serwerowe) - co nie jest prawdopodobne w scenariuszu OP. Jak sugerujesz, wydaje mi się rsync, że nie można wykonać prawdziwej dwukierunkowej synchronizacji , ponieważ wymagane jest zapisywanie stanu między uruchomieniami.
mklement0
3

Możesz spróbować csync , jest to silnik synchronizacji pod maską owncloud .

marton78
źródło
2
Wydaje się, że od 2018 roku rozwój csync utknął w martwym punkcie i wygląda na to, że owncloud się rozwidla. Zobacz: github.com/owncloud/client/issues/4661, aby uzyskać więcej informacji
Aaron
1

Teraz używam SparkleShare https://www.sparkleshare.org/

działa na mac, linux i windows.

mwm
źródło
w miarę upływu czasu aktualizuję swoje rozwiązanie. Teraz używam nextcloud na moim serwerze domowym. synchronizacja z klientem nextcloud na Linuksie, Macu, Windowsie, Androidzie i iOS.
mwm
0

Nie jestem pewien, czy działa to z dwiema synchronizacjami, ale aby --delete działało, musisz również dodać parametr --recursive.

Boardy
źródło
1
Krótki równoważne opcji --recursejest -r, co PO jest za pomocą (wbudowany w grupie sprężonego opcji -avzru).
mklement0
0

Możesz użyć Cloudync, aby zachować synchronizację folderu z pilotem:

pip install cloudsync
pip install cloudsync-gdrive
cloudsync sync file:c:/users/me/documents gdrive:/mydocs

Jeśli pilot to NFS, możesz użyć:

cloudsync sync file:c:/users/me/documents/ file:/mnt/nfs/whatevs
Erik Aronesty
źródło
-1

Rclone jest tym, czego szukasz. Rclone („rsync do przechowywania w chmurze”) to program wiersza poleceń do synchronizowania plików i katalogów z różnymi dostawcami pamięci masowej w chmurze, w tym z lokalnymi systemami plików. Rclone był wcześniej znany jako Swiftsync i jest dostępny od 2013 roku.

user1461607
źródło
Nie obsługuje dwukierunkowej synchronizacji: rclone.org/commands/rclone_sync
Martin Braun,