rsync - zgłoś tylko przesłane pliki


14

Mam problem z rsync: albo pokazuje mi wszystkie pliki w katalogach, które rsyncing (jeśli korzystam z flagi -v), albo w ogóle nic (kiedy nie korzystam -v).

Chciałbym mieć cichą synchronizację rsync, z wyjątkiem plików, które faktycznie musiały zostać przesłane na drugi koniec. Czy istnieje flaga aktywująca tego rodzaju raportowanie? Nie mogę tego znaleźć w dokumentacji

Odpowiedzi:


11

Tak, sprawdź -i flagę. Daje raport o każdej operacji w tajemniczym formacie. Zobacz stronę podręcznika dla dokładnej definicji formatu.

Aby uzyskać listę plików wysyłanych do zdalnego hosta, możesz użyć następujących opcji:

rsync <options> -i <src> <dst> | grep '^<' | awk '{ print $2 }'

1
Ponownie zgłasza wszystkie pliki, nie te zmienione.
dangonfast

@gonvaled Nie, wyprowadzane są tylko pliki wysyłane do zdalnego hosta (ponieważ <fcstpoguax filenameróżne flagi wskazują, dlaczego należy je zaktualizować). Jeśli zgłasza wszystkie pliki, coś może być nie tak z testem lub środowiskiem.
Oliver

Myślę, że masz rację. Rzuciłem okiem na stronę podręcznika i jest ona opisana tak jak mówisz. Ale mój system zgłasza wszystkie pliki. Może coś nie tak z dalekim końcem ...
Dangonfast

Mmmm coraz bliżej: ciąg raportowania to (dla wszystkich plików) <f..T....... Według strony podręcznika jest to związane ze znacznikami czasu.
dangonfast

1
użycie grep -E '^[^.]|^$'pozwoliłoby również przepuścić statystyki (lub ostrzeżenia, błędy, ...), usuwając tylko naprawdę nudne linie zaczynające się od kropki ...
Frank Nocke

10

rsync z jednym -vfaktycznie drukuje tylko przesłane pliki. Jeśli za każdym razem otrzymujesz pełną listę, oznacza to prawdopodobnie, że domyślny algorytm porównywania rsync src / dest, który jest oparty na czasie modyfikacji i rozmiarze, nie jest odpowiedni dla twojego przypadku. Możesz dodać flagę -c( --checksum), która powoduje, że rsync porównuje pliki przez sprawdzanie. Zauważ, że to oczywiście pociąga za sobą pewne koszty we / wy.

Nieznacznie powiązany jest fakt, że jeśli użyjesz --info=flistzamiast -vtego, uzyskasz bardziej przycięte wyjście plików (w zasadzie pomijasz nagłówek i stopkę typowego -vwyjścia).


1
--info=flistjest dostępna tylko w rsync> = 3.1, co nie jest dostępne wszędzie. Na przykład macOS jest dostarczany ze starą wersją 2.6.9, ponieważ Rsync v3 jest w wersji GPL 3.
chiborg

1
Chociaż pogłoska o Apple GPL jest super-soczysta, pamiętaj również, że Enterprise Linux ma ogromny zakres wsparcia (14 lat), w którym wersje są zablokowane (i rozgałęzione), aby zachować certyfikację i zagwarantować kompatybilność (api + abi) przez cały obsługiwany okres wydania . Jest to właściwie jedyny możliwy sposób, aby to zrobić, a efektem ubocznym jest to, że numery wersji wydają się stare, a nowe funkcje nie uderzają w Enterprise przez długi czas.
user2066657,

2

jedną rzeczą, która przychodzi mi na myśl, jest użycie bardziej pełnego formatu dziennika i przeszukiwanie tego, co chcesz uzyskać.

na przykład:

rsync -a --out-format="%b  %i %f" /etc/ /tmp/qq/ |awk '{if ($1>0) {print $3}}'

nie jest to zbyt solidne, nie poradzi sobie dobrze z nazwami plików ze spacjami.


1

1. Użyj -iopcji

Dla tych ikonizowanych (lub: tajemniczych) flag zmieniaj. Dane wyjściowe będą wyglądać następująco:

*deleting   DSC00012 (copy).JPG
.d..tp..... ./
.f...p..... DSC00011.JPG
>f+++++++++ DSC00012 (copy2).JPG
>f.stp..... DSC00012.JPG
.f...p..... DSC00014.JPG

Number of files: 5 (reg: 4, dir: 1)
Number of created files: 1 (reg: 1)
... more statistic stuff
sent 636.01K bytes  received 4.63K bytes  1.28M bytes/sec
total size is 2.84M  speedup is 4.44

2. grep każdą linię zaczynającą się od kropki.

Niech wszystkie inne wiersze (również puste, dla czytelności) przechodzą:

rsync -arz -i --stats -h ... /mnt/FooDrive/ /mnt/backup  | grep -E '^[^.]|^$'

A oto jesteśmy :-) - Właśnie to, co zlecił lekarz:

*deleting   DSC00012 (copy2).JPG
>f.stp..... DSC00011.JPG
>f+++++++++ DSC00012 (copy).JPG

Number of files: 5 (reg: 4, dir: 1)
Number of created files: 1 (reg: 1)
...

Unikanie kropek zamiast polowania > ma tę zaletę, że przepuszcza statystyki, ale także potencjalne błędy, ostrzeżenia itp. Przechodzą ...

Posiadanie statystyk na końcu jest osobistą preferencją. Nie używaj, -h --statsjeśli ci się nie podoba. Zakładam, że Twoim głównym zainteresowaniem jest nie przewijanie setek lub tysięcy niezmienionych plików ...


0

Nie sądzę, żeby była do tego flaga, ale może być teraz. Oto jak to zrobiłem:

rsync -vv [other options] | grep -v 'uptodate'

1
Mój rsync (wersja 3.0.7) nie dodaje uptodatesię do raportowania, więc nie można go odfiltrować.
dangonfast

Chcę poprawić, a przynajmniej wyjaśnić, co Mike napisał powyżej i na co zwrócił uwagę @ jeckyll2hide. Myślę, że problemem nie jest to, że rsync -v nie emituje już ciągu „uptodate”, ale raczej, że musisz użyć rsync -vv. Zauważ, że dwa kontra właśnie zweryfikowałem, że działa na Ubuntu 14.04 z rsync w wersji 3.1.0. Mike, czy możesz zaktualizować swój post, aby to odzwierciedlić?
John Mark Mitchell
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.