Jak zapewnić automatyczną synchronizację dwóch folderów?

86

Chciałbym mieć zsynchronizowaną kopię jednego folderu ze wszystkimi jego poddrzewem.

Powinien działać automatycznie w ten sposób: za każdym razem, gdy tworzę, modyfikuję lub usuwam rzeczy z oryginalnego folderu, te zmiany powinny być automatycznie stosowane do folderu synchronizacji.

Jakie jest najlepsze podejście do tego zadania?

BTW: Jestem na Ubuntu 12.04

Ostatecznym celem jest oddzielna kopia zapasowa w czasie rzeczywistym, bez użycia dowiązań symbolicznych lub montowania. Użyłem Ubuntu One do synchronizacji danych między moimi komputerami i po chwili coś poszło nie tak i wszystkie moje dane zostały utracone podczas synchronizacji.

Pomyślałem więc, aby dodać krok dalej, aby zachować kopię zapasową moich danych:

  • Przechowuję dane w „folderze A”
  • Potrzebuję odpowiedzi na moje obecne pytanie, aby utworzyć jednokierunkową synchronizację „folderu A” do „folderu B” ( cronskrypt z rsync? Może być?). Potrzebuję, aby był tylko jednokierunkowy z A do B, żadne zmiany w B nie mogą być stosowane w A.
  • Po prostu utrzymuję synchronizację „folderu B” z Ubuntu One.

    W ten sposób każda zmiana w A zostanie zastosowana do B, która zostanie wykryta z U1 i zsynchronizowana z chmurą. Jeśli coś pójdzie nie tak i U1 usunie moje dane z B, zawsze mam je na A.

Zainspirowany komentarzami Lanzza, innym pomysłem mogłoby być uruchomienie rsync przy starcie w celu wykonania kopii zapasowej zawartości folderu w Ubuntu One i uruchomienie Ubuntu One dopiero po zakończeniu rsync.

Co myślicie o tym? Po czym poznać zakończenie rsync?

Luca Borrione
źródło
Co próbujesz osiągnąć? Czy foldery naprawdę muszą być oddzielne, czy nie możesz dowiązać symbolicznego jednej nazwy do drugiej lub podłączyć katalog do lokalizacji dodatkowej? Przyjrzyj się również wynikom wyszukiwania .
lanzz
1
Radzę przed rzeczywistą synchronizację żywo (czyli oglądania ciągle zmiany plików w katalogu źródłowym) na rzecz okresowych rsyncza pośrednictwem cron.
lanzz

Odpowiedzi:

99

Możesz użyć inotifywait(z modify,create,delete,movewłączonymi flagami) i rsync.

while inotifywait -r -e modify,create,delete,move /directory; do
    rsync -avz /directory /target
done

Jeśli nie masz inotifywaitw swoim systemie, uruchomsudo apt-get install inotify-tools

silgon
źródło
3
Możesz rozważyć dodanie -e ssh user@remote:/targetdo, rsyncjeśli chcesz używać SSH jako transportu, aby uzyskać dostęp do zdalnego komputera.
Falcon
2
Dzięki @Falcon, zwykle używam rsync -avz --delete --exclude-from=.rsyncignore /directory user@server:path. Jednak chciałem napisać prostą odpowiedź.
silgon
4
wyjaśnienie: czy to jest jednorazowa rzecz, czy może dodałbyś to do bashrc czy coś w tym stylu?
Brad Johnson
1
Całość pętli while można traktować jako proces synchronizujący się w razie potrzeby. Zwykle dodaję go do pliku Makefile projektu, nad którym pracuję. W ten sposób mogę wybrać serwer i katalog, w którym ma być zapisany. Jednym z moich przypadków użycia jest sytuacja, gdy programuję algorytmy głębokiego uczenia na swoim laptopie i synchronizuję go, aby wykonać ciężki proces na dedykowanym komputerze z lepszym procesorem i GPU. Wykluczam również pliki, których nie potrzebuję, takie jak .gitfolder.
silgon
2
To nie obsługuje modify,create,delete,move
zmian
24

Potrzebujesz czegoś takiego: https://github.com/axkibe/lsyncd Jest to narzędzie, które łączy rsync i inotify - to pierwsze jest narzędziem, które tworzy kopię lustrzaną katalogu do ostatniego bitu z ustawionymi odpowiednimi opcjami. Ta ostatnia mówi jądru, aby powiadomiło program o zmianach w katalogu lub pliku. To mówi:

Agreguje i łączy zdarzenia przez kilka sekund, a następnie generuje jeden (lub więcej) proces (y) w celu zsynchronizowania zmian.

Ale - według Digital Ocean na https://www.digitalocean.com/community/tutorials/how-to-mirror-local-and-remote-directories-on-a-vps-with-lsyncd - powinno być repozytorium Ubuntu!

Mam podobne wymagania, a to narzędzie, którego jeszcze nie wypróbowałem, wydaje się odpowiednie do tego zadania.

Jaskółka oknówka
źródło
1
lsyncd początkowo wydawał się być srebrną kulą, ale zawiera wiele otwartych problemów i najwyraźniej implementacja macOS jest „stara i przestarzała”. Nie mogłem zmusić go do pracy 10.12.
płatny kujon
@apaidnerd Szczerze mówiąc, jest 90 otwartych zgłoszeń, a 420 zamkniętych. Chociaż tylko 10/40 numerów zostało zamkniętych w ciągu ostatniego roku.
Mateen Ulhaq
8

Wystarczy prosta modyfikacja odpowiedzi @silgon:

while true; do 
  inotifywait -r -e modify,create,delete /directory
  rsync -avz /directory /target
done

(Wersja @silgon czasami ulega awarii na Ubuntu 16, jeśli uruchomisz ją w cron)

Denis Kuzin
źródło
2
Dlaczego miałbyś uruchomić to w cronie?
saygley
@saygley W przypadku konkretnego zadania po ponownym uruchomieniu Ubuntu proces synchronizacji powinien zostać uruchomiony automatycznie
Denis Kuzin
5
Rozumiem… Niemniej jednak, ponieważ normalnie powinno to być uruchamiane raz i działać tak długo, jak serwer jest włączony; Zamiast tego rozważałbym coś wbudowanego w rc.local.
saygley
2

Możesz skorzystać z fschange . To powiadomienie o zmianie systemu plików Linuksa. Kod źródłowy można pobrać z powyższego linku, możesz go samodzielnie skompilować. fschangemoże być używany do śledzenia zmian plików poprzez odczyt danych z pliku proc (/ proc / fschange). Kiedy dane są zapisywane do pliku, fschange podaje dokładny interwał, który został zmodyfikowany, zamiast po prostu mówić, że plik został zmieniony. Jeśli szukasz bardziej zaawansowanego rozwiązania, proponuję sprawdzić Resilio Connect . Jest wieloplatformowy, zapewnia rozszerzone opcje użytkowania i monitorowania. Ponieważ jest oparty na BitTorrent, jest szybszy niż jakiekolwiek inne istniejące narzędzie do synchronizacji. Został napisany w ich imieniu.


źródło
0

Używam tego darmowego programu do synchronizacji lokalnych plików i katalogów: https://github.com/Fitus/Zaloha.sh . Repozytorium zawiera również proste demo.

Dobra uwaga: jest to skrypt powłoki bash (tylko jeden plik). Nie jest to czarna skrzynka, jak inne programy. Jest tam również dokumentacja. Ponadto, mając pewne talenty techniczne, można go „zgiąć” i „zintegrować”, aby stworzyć ostateczne rozwiązanie, które lubisz.

Petas
źródło