W jaki sposób rsync decyduje, co synchronizować?

15

Znajduję wiele odpowiedzi na to pytanie, więc chciałem zapytać ludzi, którzy faktycznie z niego korzystają, a nie tylko założyć największy blog, wypełniając losowe, częściowo bezużyteczne informacje.

Scenariusz: ja rsync -av --progress /dir/a /dir/b i robi swoje.

Dodaję nowe pliki do / dir / a i ponownie uruchamiam to samo polecenie, wie, co zrobił i kopiuje tylko nowe pliki.

Dodam nowe pliki do / dir / a i zmieniam nazwy niektórych plików w / dir / b, a może też usunę kilka.

Jeśli uruchomię rsync -av --progress /dir/a /dir/bponownie, co zostanie skopiowane? Tylko nowe pliki, ponieważ wie, co wcześniej skopiował, lub pliki, których nazwy zmieniono / usunięto, ponieważ już ich nie ma.

A jeśli dodatkowo skopiowane wcześniej pliki zostaną ponownie skopiowane, czy można temu zapobiec, aby kopiowane były tylko nowe dodatki do katalogu / dir / a?

W tej chwili z przyjemnością sprawdzam rzeczy ręcznie, ale w miarę powiększania się danych potrzebuję więcej automatyzacji, aby wykonać to zadanie.

SPOOKYiNeSS
źródło
3
-iFlaga jest bardzo poręczny. Dla każdego pliku daje ciąg pasujący, który można zdekodować, aby zobaczyć, dlaczego pasuje (flaga dla czasu mod, flaga dla rozmiaru itp.)
BowlOfRed

Odpowiedzi:

17

Dodaję nowe pliki do / dir / a i ponownie uruchamiam to samo polecenie, wie, co zrobił i kopiuje tylko nowe pliki.

Nie, nie wie, co zrobił w poprzednim uruchomieniu. Porównuje dane po stronie odbierającej z danymi do wysłania. Przy wystarczająco małych danych nie będzie to oczywiste, ale gdy masz wystarczająco duże katalogi, łatwo jest wyczuć czas poświęcony na porównanie przed rozpoczęciem kopiowania.

Domyślnie sprawdzane są czasy i rozmiary modyfikacji plików. Od man rsync:

-c, --checksum
      This changes the way rsync checks if the files have been changed
      and  are in need of a transfer.  Without this option, rsync uses
      a "quick check" that (by default) checks if each file’s size and
      time of last modification match between the sender and receiver.
      This option changes this to compare a 128-bit checksum for  each
      file  that  has a matching size.  Generating the checksums means
      that both sides will expend a lot of disk I/O  reading  all  the
      data  in  the  files  in  the transfer (and this is prior to any
      reading that will be done to transfer changed  files),  so  this
      can slow things down significantly.

I:

-u, --update
      This  forces  rsync  to  skip  any  files  which  exist  on  the
      destination  and  have  a  modified  time that is newer than the
      source  file.   (If  an  existing   destination   file   has   a
      modification time equal to the source file’s, it will be updated
      if the sizes are different.)

Pamiętaj, że nie wynika to z użytych opcji. -ajest:

-a, --archive               archive mode; same as -rlptgoD (no -H)
-r, --recursive             recurse into directories
-l, --links                 copy symlinks as symlinks
-p, --perms                 preserve permissions
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
    --devices               preserve device files (super-user only)
    --specials              preserve special files
-D                          same as --devices --specials
-t, --times                 preserve times
muru
źródło
Najlepszy opis, jaki widziałem (do tej pory), dziękuję
SPooKYiNeSS
2
Mały dodatek. Zmienione pliki są traktowane jako unikalne pliki na obu końcach. Określenie --fuzzyraz rozpozna je jako takie same w tym samym katalogu. --fuzzyDwukrotne użycie rozszerza tę zdolność do innych lokalizacji. Zobacz man rsyncszczegóły. Oczywiście jednym z głównych powodów używania rsyncjest możliwość kopiowania tylko tych części pliku, które uległy zmianie. Może to znacznie przyspieszyć przesyłanie danych przez sieć. BTW, opcja sumy kontrolnej jest wspomniana powyżej w celu wyjaśnienia, jak rsyncdziała. W większości przypadków nie należy go używać.
Joe
6

Generał

Jeśli dobrze rozumiem, rsync -avnie ma pamięci, więc skopiuje również pliki, których nazwy zostały zmienione / usunięte, ponieważ są one obecne w źródle, ale nie są już obecne w celu.

Porady

  • Użyj opcji -n„bieg próbny”, aby sprawdzić, co się stanie przed uruchomieniem rsyncwiersza polecenia.

  • Zwróć uwagę na specjalne znaczenie końcowego ukośnika po katalogu źródłowym i zauważ różnicę między

    rsync -av --progress dir/a/ dir/b
    

    i

    rsync -av --progress dir/a dir/b
    

    który jest opisany w instrukcji man rsync.

Przykład

Specjalny przypadek (dodanie pliku do katalogu źródłowego „a” i usunięcie pliku z katalogu docelowego „b”) spowoduje dodanie zarówno dodanego pliku, jak i wcześniej skopiowanego pliku, ponieważ nadal znajduje się on w katalogu źródłowym. Stanie się tak zarówno z opcją, jak i bez niej, -ui nie znam żadnej opcji, rsyncaby to łatwo naprawić, jeśli chcesz zachować ją w katalogu źródłowym.

Ale możesz usunąć go z katalogu źródłowego lub umieścić nazwę pliku w pliku excludedi użyć opcji --exclude-from=excluded(dla wielu plików) lub po prostu --exclude=PATTERNdla jednego lub kilku plików.

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-2

sent 103 bytes  received 25 bytes  256.00 bytes/sec
total size is 13  speedup is 0.10 (DRY RUN)

$ rsync -av --progress dir/a/ dir/b
sending incremental file list
./
file-1
              6 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
file-2
              7 100%    6.84kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 196 bytes  received 57 bytes  506.00 bytes/sec
total size is 13  speedup is 0.05

$ echo textx-3>./dir/a/file-3

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 121 bytes  received 22 bytes  286.00 bytes/sec
total size is 21  speedup is 0.15 (DRY RUN)

$ rm dir/b/file-1 
rm: ta bort normal fil 'dir/b/file-1'? y

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --exclude=file-1 --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 104 bytes  received 22 bytes  252.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

Alternatywny: unison

Możesz przetestować narzędzie unison, które jest narzędziem synchronizującym . Zapewnia wizualną metodę identyfikacji specjalnych przypadków i decydowania o tym, co robić. Istnieje wersja GUI ( unison-gtk).

sudodus
źródło
Ładne przykłady dzięki.
Znałem
I znowu wysyła, zanim skończę i nie pozwala mi edytować mojego komentarza ... Skopiowałem / wkleiłem drugi. Rzucę okiem na unuson i zobaczę, czy może zrobić to, co chcę, a jeśli nie, wrócę do planu b i po prostu
stworzę
Używam unison-gtkod kilku lat i jestem z tego zadowolony. (Ja rsyncteż używam .)
sudodus
1

Kopiuje tylko nowe pliki w katalogu / dir / a. Cokolwiek zrobisz w / dir / b, zostanie zignorowane, chyba że użyjesz opcji --delete. W takim przypadku pliki o zmienionej nazwie w katalogu / dir / b zostaną usunięte. Zmusi / dir / b, aby stał się dokładnie jak / dir / a.

Jeśli chodzi o premię, masz na myśli jak w przypadku zmiany nazwy plików w / dir / a, a następnie rsynchronizacji do / dir / b? Nie sądzę, że istnieje sposób, aby zapobiec rsync po prostu kopiowaniu plików w tym przypadku.

Hermann Ingjaldsson
źródło
Nie spodziewałem się, że będzie jakiś sposób, inny niż użycie atrybutu do ustalenia, ale jeśli stworzę skrypt dla dzieci i będę potrzebował więcej. Dziękuję za odpowiedź, przynajmniej teraz wiem, co muszę zrobić.
SPooKYiNeSS