rsync: różnica między --size-only i --ignore-times

114

Próbuję zrozumieć, jaka jest różnica między dwiema opcjami

rsync --size-only

i

rsync --ignore-times

Rozumiem, że domyślnie rsync porównuje zarówno sygnatury czasowe, jak i rozmiary plików, aby zdecydować, czy plik powinien zostać zsynchronizowany, czy nie. Powyższe opcje pozwalają użytkownikowi wpływać na to zachowanie.

Wydaje się, że obie opcje, przynajmniej werbalnie, prowadzą do tego samego: porównywania tylko według rozmiaru .

Czy brakuje mi tu czegoś subtelnego?

alfred_j_kwack
źródło
18
To prawdopodobnie lepiej pasować na coś podobnego SuperUser.com lub Unix.SE , ponieważ jest to temat raczej niż przy użyciu istniejącego (bez programowania pokrewne) narzędzie cokolwiek bezpośrednio związane z pisania kodu.
Jerry Coffin

Odpowiedzi:

110

Istnieje kilka sposobów porównywania plików przez rsync - autorytatywnym źródłem jest opis algorytmu rsync: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf . Artykuł wikipedii na rsync jest również bardzo dobra.

W przypadku plików lokalnych rsync porównuje metadane i jeśli wygląda na to, że nie musi kopiować pliku, ponieważ rozmiar i sygnatura czasowa są zgodne między źródłem a miejscem docelowym, nie szuka dalej. Jeśli nie pasują, jest to plik cp. A co, jeśli metadane są zgodne, ale pliki nie są w rzeczywistości takie same? Wtedy rsync prawdopodobnie nie zrobił tego, co zamierzałeś.

Pliki o tym samym rozmiarze mogły się jeszcze zmienić. Jednym prostym przykładem jest plik tekstowy, w którym poprawiamy literówkę - na przykład zmieniając „teh” na „the”. Rozmiar pliku jest taki sam, ale poprawiony plik będzie miał nowszą sygnaturę czasową. --size-onlymówi „nie patrz na czas; jeśli rozmiar pasuje, zakładaj, że pliki są zgodne”, co w tym przypadku byłoby złym wyborem.

Z drugiej strony, przypuśćmy, że cp -r A Bwczoraj przypadkowo zrobiłeś coś wielkiego , ale zapomniałeś zachować znaczniki czasu, a teraz chcesz wykonać operację w odwrotnej kolejności rsync B A. Wszystkie pliki, które utworzyłeś, mają sygnaturę czasową z wczoraj, mimo że nie zostały wczoraj tak naprawdę zmodyfikowane, a rsync domyślnie kopiuje wszystkie te pliki i aktualizuje również sygnaturę czasową do wczoraj. --size-onlymoże być twoim przyjacielem w tym przypadku (modulo powyższy przykład).

--ignore-timesmówi, aby porównać pliki niezależnie od tego, czy pliki mają ten sam czas modyfikacji. Rozważ powyższy przykład literówki, ale potem nie tylko poprawiłeś literówkę, ale także sprawiłeś, touchże poprawiony plik miał taki sam czas modyfikacji jak oryginalny plik - powiedzmy, że jesteś podstępny w ten sposób. Dobrze --ignore-timeszrobi różnicę plików, nawet jeśli rozmiar i czas pasują.

ckg
źródło
58

Krótka odpowiedź brzmi: --ignore-timesrobi więcej, niż sugeruje jego nazwa. Ignoruje zarówno czas, jak i rozmiar. W przeciwieństwie do tego --size-onlyrobi dokładnie to, co mówi.


Długa odpowiedź brzmi: rsyncistnieją trzy sposoby decydowania, czy plik jest nieaktualny:

  1. Porównaj rozmiar źródła i przeznaczenia.
  2. Porównaj sygnaturę czasową źródła i miejsca docelowego.
  3. Porównaj statyczną sumę kontrolną źródła i celu.

Te sprawdzenia są wykonywane przed przesłaniem danych. W szczególności oznacza to, że statyczna suma kontrolna różni się od sumy kontrolnej strumienia - ta ostatnia jest obliczana podczas przesyłania danych.

Domyślnie rsyncużywa tylko 1 i 2. Oba 1 i 2 mogą być zebrane razem przez pojedynczy stat, podczas gdy 3 wymaga wczytania całego pliku (jest to niezależne od odczytu pliku do przesłania). Zakładając, że określono tylko jeden modyfikator, oznacza to:

  • Używając --size-only, wykonywany jest tylko 1 - znaczniki czasu i suma kontrolna są ignorowane. Plik jest kopiowany, chyba że jego rozmiar jest identyczny z obu stron.

  • Używając --ignore-times, nie jest wykonywany żaden z 1, 2 lub 3. Plik jest zawsze kopiowany.

  • Używając --checksum, oprócz 1 używane jest 3 , ale 2 nie jest wykonywane. Plik jest kopiowany, chyba że rozmiar i suma kontrolna są zgodne. Suma kontrolna jest obliczana tylko wtedy, gdy rozmiar jest zgodny.

MisterMiyagi
źródło
1
- suma kontrolna jest dokładnie tym, czego szukałem. Kopiowałem wynik kompilacji, który zmienił się tylko w czasie dla większości plików. Dodanie --checksum oznaczało zignorowanie różnic czasowych, ale upewniło się, że są one identyczne bit po bicie. To było to, czego się spodziewałem - więcej razy to zrobię, dziękuję za dodatkowe informacje.
Joseph Connolly
50

Brakuje Ci tego, że rsync może również porównywać pliki według sumy kontrolnej.

--size-onlyoznacza, że ​​rsync pominie pliki o pasującym rozmiarze, nawet jeśli znaczniki czasu się różnią. Oznacza to, że będzie synchronizować mniej plików niż przy domyślnym zachowaniu. Pominie każdy plik ze zmianami, które nie mają wpływu na ogólny rozmiar pliku. Jeśli masz coś, co zmienia daty w plikach bez zmiany plików i nie chcesz, aby rsync spędzał dużo czasu na sprawdzaniu tych plików, aby odkryć, że nie uległy zmianie, jest to opcja do użycia.

--ignore-timesoznacza, że ​​rsync zsumuje każdy plik, nawet jeśli sygnatury czasowe i rozmiary plików są zgodne. Oznacza to, że będzie synchronizować więcej plików niż przy domyślnym zachowaniu. Obejmuje zmiany w plikach, nawet jeśli rozmiar pliku jest taki sam, a data / godzina modyfikacji została przywrócona do pierwotnej wartości. Suma kontrolna każdego pliku oznacza, że ​​musi on zostać w całości odczytany z dysku, co może być powolne. Niektóre potoki kompilacji resetują znaczniki czasu do określonej daty (np. 1970-01-01), aby upewnić się, że ostateczny plik kompilacji jest odtwarzalny bit po bicie, np. Po spakowaniu do pliku tar, który zachowuje znaczniki czasu.

rjmunro
źródło
4
„resetowanie daty / godziny jest mało prawdopodobne w praktyce, ale może się zdarzyć” - na przykład w przypadku korzystania z oprogramowania, które w imieniu odtwarzalnych kompilacji na siłę resetuje każdy plik do stanu z 1970-01-01 zamiast daty i czas faktycznego utworzenia / modyfikacji.
10
Właściwie myślę, że potrzebujesz opcji -c, jeśli chcesz używać sum kontrolnych. Bez tego --ignore-times skopiuje wszystkie pliki bezwarunkowo.
Edward Falk
1
Opcja -a może przesłonić te opcje. W moim przypadku użyłem --compare-dir = i --size-only i otrzymałem nieoczekiwane wyniki. Zmiana -a na -r rozwiązała problem.
dbagnara
@dbagnara Potwierdziłem dzisiaj, że --size-only "znajduje się na" -a "lub" overrides "-a. Miałem dysk, który z jakiegoś powodu zamontowany ze wszystkimi czasami modyfikacji wydłużył się o miesiąc. Rsync to backup kopiował każdy plik (z -a ON). Dodanie --size-only rozwiązało problem i doprowadziło do pożądanych rezultatów (więc -a --size-only). Więc dochodzę do wniosku, że tylko rozmiar zastępuje archiwum.
Tommy
1

W systemie Scientific Linux 6.7 strona podręcznika rsync mówi:

--ignore-times          don't skip files that match size and time

Mam dwa pliki o identycznej zawartości, ale z różnymi datami utworzenia:

[root@windstorm ~]# ls -ls /tmp/master/usercron /tmp/new/usercron
4 -rwxrwx--- 1 root root 1595 Feb 15 03:45 /tmp/master/usercron
4 -rwxrwx--- 1 root root 1595 Feb 16 04:52 /tmp/new/usercron

[root@windstorm ~]# diff /tmp/master/usercron /tmp/new/usercron
[root@windstorm ~]# md5sum /tmp/master/usercron /tmp/new/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/master/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/new/usercron

Dzięki --size-onlytemu oba pliki są traktowane tak samo:

[root@windstorm ~]# rsync -v --size-only -n  /tmp/new/usercron /tmp/master/usercron

sent 29 bytes  received 12 bytes  82.00 bytes/sec
total size is 1595  speedup is 38.90 (DRY RUN)

W przypadku --ignore-timeste dwa pliki są traktowane inaczej:

[root@windstorm ~]# rsync -v --ignore-times -n  /tmp/new/usercron /tmp/master/usercron
usercron

sent 32 bytes  received 15 bytes  94.00 bytes/sec
total size is 1595  speedup is 33.94 (DRY RUN)

Więc wygląda na to, że nie --ignore-timesma żadnego efektu.

Peter Chiu
źródło
2
--ignore-timesskopiowałby pliki, nawet gdyby ich sygnatury czasowe były takie same.
MisterMiyagi