Jak synchronizować tylko nowe pliki

143

Próbuję skonfigurować rsync do synchronizacji mojego głównego serwera WWW ze zdalnym serwerem poprzez dodanie nowo wygenerowanego pliku do późniejszego.

Oto polecenie, którego używam:

rsync -avh --update -e "ssh -i /path/to/thishost-rsync-key" remoteuser@remotehost:/foo/bar /foo/bar

Wygląda jednak na to, że serwer sieciowy faktycznie przenosi wszystkie pliki pomimo flagi „--update”. Próbowałem różnych kombinacji flag (np. Pomijając „-a” i zamiast tego używam „-vv”), ale żadna nie pomogła. Zastanawiam się więc, jak mogę zmodyfikować polecenie rsync, aby wysyłać tylko nowo dodane pliki. Dzięki

supermario
źródło
2
Jeśli chcesz synchronizować pliki do zdalnego serwera, nie powinien on pochodzić ostatni? tj. rsync /foo/bar remoteuser@remotehost:/foo/bar
ostrokach
Ta strona może Cię zainteresować . Uważaj również na system plików. Jeśli system plików serwera nie obsługuje wszystkich tych -aopcji (właściciel, grupa, perms, ...), powinno to być przyczyną naszego problemu.
ppr.
2
Żadna z odpowiedzi nie rozwiązuje problemu polegającego na tym, że lokalne pliki nie zostały w pełni skopiowane do zdalnego miejsca docelowego, a Ty chcesz tylko synchronizować nowsze pliki.
Axel Bregnsbo,
Właśnie znalazłem -copcję. Pomija istniejące pliki na podstawie sumy kontrolnej, zamiast czasu modyfikacji lub rozmiaru.
haheute

Odpowiedzi:

180

Od man rsync:

--ignore-existing       skip updating files that exist on receiver

--updaterobi coś nieco innego, dlatego prawdopodobnie otrzymujesz nieoczekiwane wyniki (patrz man rsync):

Zmusza to rsync do pominięcia wszystkich plików, które istnieją w miejscu docelowym i mają zmodyfikowany czas nowszy niż plik źródłowy . (Jeśli istniejący plik docelowy ma czas modyfikacji równy czasowi pliku źródłowego, zostanie zaktualizowany, jeśli rozmiary są różne).

Chris Down
źródło
1
Właściwie wypróbowałem polecenie z „--ignore-exist” zamiast „--update”. Skończył się szybko, ale nie umieszcza nowych plików na zdalnym hoście. Jakieś pomysły? Dzięki
supermario
13
Strony podręcznika są do kitu (to prawda, poszedłem tam), przypadek, czy to --ignore-existingznaczy, że nie przesyłaj plików, które istnieją w odbiorniku, ani nie przesyłaj plików, jeśli jakiś plik / folder o tej samej nazwie istnieje w odbiorniku?
puk
7
--update nie pomiń pliki gdy mtime są identyczne (co jest nie co oznacza sformułowanie). Przetestowałem to. Uważam, że sformułowanie byłoby lepiej zrozumiałe, gdyby powiedziało, że „kopiowane będą tylko pliki źródłowe, które są nowsze niż docelowe”.
Octopus
4
@Octopus „kopiowane będą tylko pliki źródłowe, które są nowsze niż miejsce docelowe” ... lub pliki źródłowe, które mają taki sam czas modyfikacji jak ich odpowiedniki w pliku docelowym, ale mają różne rozmiary . Myślę, że to ważna kwestia. (Chris już to omówił, dzięki)
Jonathan Komar
Potrzebujesz więc --ignore-Istniejące i -r (rekurencyjne). -v (verbose) też miło jest mieć :-)
DutchUncle
40

W moim przypadku miałem podobne problemy, ponieważ wszystkie pliki zostały przeniesione zamiast tylko zmodyfikowanych / nowych. Rozwiązałem to za pomocą parametrów -t(zamiast -a) i -P(równoważnych --partial --progress):

rsync -h -v -r -P -t cel źródłowy

Przenosi to tylko nowe pliki i pliki już istniejące, ale zmodyfikowane: -arobi zbyt wiele, jak synchronizacja identyfikatorów użytkowników i grup, co w moim przypadku nie może działać, ponieważ mam różnych użytkowników i grupy w moich źródłowych i docelowych systemach.

Parametry w szczegółach:

  • -h: liczby czytelne dla człowieka
  • -v: pełny
  • -r: przejdź do katalogów
  • -P: --partial(zachowaj częściowo przesłane pliki) +
            --progress(pokaż postęp podczas przesyłania)
  • -t: zachowaj czasy modyfikacji
t0r0X
źródło
2
+1 za „-a robi za dużo” (rzeczywiście -rlptgoD, więc pozwolenie nie zostaje spłaszczone, grupy i właściciel zachowane - nie moja typowa bezpieczna kopia zapasowa ...)
Frank Nocke,
2

Z mojego doświadczenia z rsync, kopiowanie partycji 1 TB jest zbyt duże, aby było wydajne. Przetwarzanie wymaga rsync na zawsze. Zamiast tego zrób to według podkatalogów. Oznacza to, że uruchom rsync dla każdego głównego podkatalogu. Idzie o wiele szybciej, jeśli nie musi żonglować dziesiątkami tysięcy plików.

turgut kalfaoglu
źródło
1
Może zabrakło Ci pamięci i system zaczął się zamieniać?
Marcel Burkhard
-2

Próbować

rsync -zvrt --update SOURCE DESTN
omega
źródło
8
Dla OP byłoby mile widziane nieco więcej wyjaśnienia dla powyższego polecenia.
Peschke,
ze strony
podręcznika