Przyjrzyjmy się, jak działa rsync i lepiej zrozummy tajemnicze linie wyników:
1 - Ogromną zaletą rsync jest to, że po kolejnej przerwie działa płynnie.
Kolejne wywołanie rsync nie prześle ponownie plików, które zostały już przesłane, jeśli nie zostały one w międzyczasie zmienione. Ale zacznie ponownie sprawdzać wszystkie pliki od początku, aby się dowiedzieć, ponieważ nie jest świadomy, że zostało przerwane.
2 - Każdy znak to kod, który można przetłumaczyć, jeśli przeczytasz sekcję dotyczącą -i, --itemize-changes
wman rsync
Dekodowanie przykładowego pliku dziennika z pytania:
> f.st ......
> - the item is received
f - it is a regular file
s - the file size is different
t - the time stamp is different
.d..t ......
. - the item is not being updated (though it might have attributes
that are being modified)
d - it is a directory
t - the time stamp is different
> f +++++++++
> - the item is received
f - a regular file
+++++++++ - this is a newly created item
Odpowiednia część strony podręcznika rsync:
-i, --itemize-changes
Żąda prostej szczegółowej listy zmian wprowadzanych w każdym pliku, w tym zmian atrybutów. To jest dokładnie to samo, co określenie --out-format = '% i% n% L'. Jeśli powtórzysz tę opcję, niezmienione pliki również zostaną wyprowadzone, ale tylko wtedy, gdy odbierający rsync ma co najmniej wersję 2.6.7 (możesz użyć -vv ze starszymi wersjami rsync, ale to również włączy wyjście innych pełnych komunikatów mędrcy).
Ucieczka „% i” ma tajemniczy wynik o długości 11 liter. Ogólny format jest podobny do ciągu YXcstpoguax, w którym Y jest zastępowane typem wykonywanej aktualizacji, X jest zastępowane typem pliku, a pozostałe litery reprezentują atrybuty, które mogą być wyprowadzane, jeśli są modyfikowane.
Typy aktualizacji, które zastępują Y, są następujące:
- A
<
oznacza, że plik jest przesyłany do zdalnego hosta (wysyłany).
- A
>
oznacza, że plik jest przesyłany do lokalnego hosta (odbierany).
- A
c
oznacza, że następuje lokalna zmiana / utworzenie elementu (na przykład utworzenie katalogu lub zmiana dowiązania symbolicznego itp.).
- A
h
oznacza, że element jest twardym łączem do innego elementu (wymaga opcji --hard-links).
- A
.
oznacza, że element nie jest aktualizowany (chociaż może mieć atrybuty, które są modyfikowane).
- A
*
oznacza, że pozostała część wyszczególnionego obszaru wyjściowego zawiera komunikat (np. „Usuwanie”).
Typy plików, które zastępują X to: f
dla pliku, a d
dla katalogu, L
dla dowiązania symbolicznego, a D
dla urządzenia i S
dla pliku specjalnego (np. Nazwane gniazda i kolejki FIFO).
Pozostałe litery w powyższym ciągu to rzeczywiste litery, które zostaną wyświetlone, jeśli powiązany atrybut elementu jest aktualizowany lub „.” bez zmian. Trzy wyjątki od tej reguły to: (1) nowo utworzony element zastępuje każdą literę znakiem „+”, (2) identyczny element zastępuje kropki spacjami oraz (3) nieznany atrybut zastępuje każdą literę znakiem „?” (może się to zdarzyć podczas rozmowy ze starszą wersją rsync).
Atrybut powiązany z każdą literą jest następujący:
- A
c
oznacza, że zwykły plik ma inną sumę kontrolną (wymaga - sumy kontrolnej) lub że dowiązanie symboliczne, urządzenie lub plik specjalny ma zmienioną wartość. Zauważ, że jeśli wysyłasz pliki do rsync starszej niż 3.0.1, ta flaga zmiany będzie obecna tylko dla zwykłych plików różniących się sumą kontrolną.
- A
s
oznacza, że rozmiar zwykłego pliku jest inny i zostanie zaktualizowany podczas przesyłania pliku.
- A
t
oznacza, że czas modyfikacji jest inny i jest aktualizowany do wartości nadawcy (wymaga --times). Alternatywna wartość T oznacza, że czas modyfikacji zostanie ustawiony na czas transferu, co ma miejsce, gdy plik / dowiązanie symboliczne / urządzenie jest aktualizowane bez --czasów i gdy dowiązanie symboliczne jest zmieniane, a odbiornik nie może ustawić swojego czasu. (Uwaga: podczas korzystania z klienta rsync 3.0.0, możesz zobaczyć flagę s połączoną z t zamiast odpowiedniej flagi T dla tego błędu ustawienia czasu).
- A
p
oznacza, że uprawnienia są różne i są aktualizowane do wartości nadawcy (wymaga --perms).
- An
o
oznacza właściciela jest inny i jest aktualizowany do wartości nadawcy (wymaga --owner i uprawnienia super użytkownika).
- A
g
oznacza, że grupa jest inna i jest aktualizowana do wartości nadawcy (wymaga --group i uprawnień do ustawienia grupy).
u
Szczelina jest zarezerwowana do wykorzystania w przyszłości.
- Te
a
środki, które informacje ACL zmieniło.
- Te
x
środki, które rozszerzone informacje atrybut zmieniły.
Możliwe jest jeszcze jedno wyjście: podczas usuwania plików "% i" wyświetli ciąg "* deleting" dla każdego usuwanego elementu (zakładając, że rozmawiasz z ostatnią dostateczną rsync, która rejestruje usunięcia zamiast wyprowadzać je jako szczegółowa wiadomość).
Jakiś czas temu musiałem zrozumieć dane
rsync
wyjściowe skryptu, który pisałem. Podczas pisania tego scenariusza przeszukałem go i doszedłem do tego, co @mit napisał powyżej . Wykorzystałem te informacje, a także dokumentację z innych źródeł, do stworzenia własnego podkładu na temat flag bitowych i sposobu uzyskaniarsync
flag bitowych dla wszystkich akcji (domyślnie nie robi tego).Publikuję tutaj te informacje w nadziei, że pomogą one innym, którzy (tak jak ja) natkną się na tej stronie za pośrednictwem wyszukiwania i potrzebują lepszego wyjaśnienia
rsync
.Dzięki połączeniu z
--itemize-changes
flagą i z-vvv
flagą,rsync
daje nam szczegółową wyjście wszystkich zmian systemu plików, które zostały zidentyfikowane w katalogu ze źródłami w porównaniu do katalogu docelowego. Flagi bitowe utworzone przezrsync
można następnie zdekodować, aby określić, co się zmieniło. Aby zdekodować znaczenie każdego bitu, skorzystaj z poniższej tabeli.Wyjaśnienie pozycji każdego bitu i wartości w
rsync
wyjściu:Przykładowe dane wyjściowe rsync dla różnych scenariuszy:
Przechwytywanie
rsync
wyjścia (skupione na flagach bitowych):W moim eksperymentów zarówno
--itemize-changes
flag i-vvv
flagi są potrzebne, aby dostać sięrsync
do wyjścia wpis dla wszystkich zmian w systemie plików. Bez-vvv
flagi triple verbose ( ) nie widziałem listy zmian katalogu, łącza i urządzenia. Warto poeksperymentować z wersją rsync, aby upewnić się, że obserwuje i odnotowuje wszystko, czego się spodziewałeś.Jednym z przydatnych zastosowań tej techniki jest dodanie
--dry-run
flagi do polecenia i zebranie listy zmian, określonej przez rsync, w zmiennej (bez dokonywania żadnych zmian), aby można było samodzielnie wykonać pewne przetwarzanie listy. Coś podobnego do poniższego przechwyciłoby dane wyjściowe w zmiennej:W powyższym przykładzie wyjście (stdout) z
rsync
jest przekierowywane dogrep
(przez stdin), więc możemy izolować tylko te wiersze, które zawierają flagi bitowe.Przetwarzanie przechwyconych danych wyjściowych:
Zawartość zmiennej można następnie rejestrować w celu późniejszego wykorzystania lub natychmiastowo iterować pod kątem interesujących nas elementów. Używam dokładnie tej taktyki w scenariuszu, o którym pisałem podczas badania
rsync
. Możesz spojrzeć na skrypt ( https://github.com/jmmitchell/movestough ), aby zobaczyć przykłady przetwarzania końcowego przechwyconych danych wyjściowych w celu wyodrębnienia nowych plików, zduplikowanych plików (ta sama nazwa, ta sama zawartość), kolizji plików (ta sama nazwa, różne zawartość), a także zmiany w strukturze podkatalogów.źródło
1) Wodin, to nie do końca prawda. Jeśli używasz tagu --partial lub -P (tak samo jak --partial --progress), rsync wznawia przerwane transfery.
2) Dokładnie, to typowe dane wyjściowe dla tagu --itemize-changes.
źródło
1.) „Zrestartuje synchronizację”, ale nie prześle plików o tym samym rozmiarze i sygnaturze czasowej itp. Najpierw tworzy listę plików do przesłania i na tym etapie zobaczy, że przesłał już niektóre pliki i pominie je. Powinieneś powiedzieć rsync, aby zachował znaczniki czasu itp. (Np. Używając
rsync -a ...
)Podczas gdy rsync przesyła plik, będzie nazywać go czymś w rodzaju
.filename.XYZABC
zamiastfilename
. Następnie, gdy zakończy przesyłanie tego pliku, zmieni jego nazwę. Tak więc, jeśli zabijesz rsync podczas przesyłania dużego pliku, będziesz musiał użyć opcji --partial, aby kontynuować transfer zamiast zaczynać od zera.2.) Nie wiem, co to jest. Czy możesz wkleić kilka przykładów?
EDYCJA: Zgodnie z http://ubuntuforums.org/showthread.php?t=1342171 te kody są zdefiniowane na stronie podręcznika rsync w sekcji dotyczącej
-i, --itemize-changes
opcji.Naprawiono część, jeśli moja odpowiedź była oparta na odpowiedzi Joao
źródło