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?
Odpowiedzi:
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-only
mó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 B
wczoraj przypadkowo zrobiłeś coś wielkiego , ale zapomniałeś zachować znaczniki czasu, a teraz chcesz wykonać operację w odwrotnej kolejnościrsync 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-only
może być twoim przyjacielem w tym przypadku (modulo powyższy przykład).--ignore-times
mó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-times
zrobi różnicę plików, nawet jeśli rozmiar i czas pasują.źródło
Krótka odpowiedź brzmi:
--ignore-times
robi więcej, niż sugeruje jego nazwa. Ignoruje zarówno czas, jak i rozmiar. W przeciwieństwie do tego--size-only
robi dokładnie to, co mówi.Długa odpowiedź brzmi:
rsync
istnieją trzy sposoby decydowania, czy plik jest nieaktualny: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
rsync
używa tylko 1 i 2. Oba 1 i 2 mogą być zebrane razem przez pojedynczystat
, 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.źródło
Brakuje Ci tego, że rsync może również porównywać pliki według sumy kontrolnej.
--size-only
oznacza, ż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-times
oznacza, ż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.źródło
W systemie Scientific Linux 6.7 strona podręcznika rsync mówi:
Mam dwa pliki o identycznej zawartości, ale z różnymi datami utworzenia:
Dzięki
--size-only
temu oba pliki są traktowane tak samo:W przypadku
--ignore-times
te dwa pliki są traktowane inaczej:Więc wygląda na to, że nie
--ignore-times
ma żadnego efektu.źródło
--ignore-times
skopiowałby pliki, nawet gdyby ich sygnatury czasowe były takie same.