Czy rsync wygeneruje plik łatki zamiast kopiować pliki?

19

Kopiuję wiele plików, które zmieniły się z jednego serwera na drugi za pomocą rsync. Wiem, że mogę skorzystać z tej -nopcji, aby wykonać próbę rozruchu, dzięki czemu mogę zobaczyć, które pliki zostały zmienione. Czy jest jednak możliwe, aby rsync wydrukował różnicę zawartości pliku, która została zmieniona? Chciałbym zobaczyć, co się dzieje przed zrobieniem kopii? Coś, co mogę zapisać do pliku i zastosować później w diff (1)?

Rory
źródło

Odpowiedzi:

8

Może istnieć lepszy sposób, ale może to działać, choć nie tak skutecznie:

 rsync -vrn / dest:/ > ~/file_list

Następnie edytuj test, aby usunąć statystyki, a następnie:

while read file; do
    diff $file <(ssh dest "cat $file")
done < ~/edited_file_list

Inna opcja:
możesz również rozważyć zamontowanie systemu plików za pomocą czegoś takiego jak sshfs / fuse, a następnie użycie diff.

Kyle Brandt
źródło
Uwaga: Nie testowałem tych poleceń ;-)
Kyle Brandt
Dobry początek, ale jest mnóstwo dodatkowych danych wyjściowych z rsync, takich jak statystyki i „wysyłanie przyrostowej listy plików” itp.
Rory
Możesz użyć --out-format = "% f"
Kyle Brandt
Jeśli korzystasz z out-formatu, upuścić v, a grep -v „pomijanie nieregularne plik” ... To powinno się to dość czyste
Kyle Brandt
Tylko sprawdzam, czy przypadkiem jest nowa / lepsza metoda rsync --diffdwa lata później ...
Pierścień Ø
2

rsync nie może tego zrobić natywnie, ale jeśli istnieje możliwość użycia unisona , możesz z niego stworzyć format w stylu diff.

Philip Reynolds
źródło
1

Nie jest to możliwe natywnie, ponieważ rsync dba tylko o różnice binarne między plikami.

Możesz być w stanie napisać skrypt, używając danych wyjściowych rsync. Ale byłoby to hacking.

Uważam jednak, że jest to możliwe w Unison .

Dan Carley
źródło
1
Czy moje rozumiesz przez hackish? :-)
Kyle Brandt
Oczywiście, Kyle: D
Dan Carley
1

Dlaczego po prostu nie użyć czegoś takiego jak diff (dla plików tekstowych) lub xdelta (dla plików binarnych) do wygenerowania różnic? Dlaczego potrzebujesz konkretnie uzyskać coś z rsync?

womble
źródło
Nie potrzebuję rsync, ale musi być zdalny
Rory
O nie, ssh!
womble
1

Aby rozwinąć odpowiedź Kyle'a, automatyzuje to proces. Zauważ, że jest całkowicie nieprzetestowany, prawdopodobnie dość delikatny i może usunąć komputer i zabić twojego psa.

#!/bin/bash

REMOTE=${1?Missing Remote Path}
LOCAL=${2?Missing Local Path}

# Trim trailing slash since we'll be adding it as a separator later
REMOTE=${REMOTE%/}
LOCAL=${LOCAL%/}

#Break it down
RHOST=${REMOTE%:*}
RPATH=${REMOTE#*:}

while read FILE; do
    diff -u ${LOCAL}/${FILE} <(ssh $RHOST "cat ${RPATH}/${FILE}")
done < <(rsync -vrn $REMOTE/ $LOCAL/ | sed '1d;/^$/q')
tylerl
źródło
0

Algorytm rsync działa poprzez porównywanie binarnych fragmentów pliku. Taki diff binarny nie jest przeznaczony do drukowania. Istnieje polecenie o nazwie rdiff, które wykorzystuje algorytm rsync do generowania binarnego pliku różnicowego, ale nie sądzę, aby przydało się to, co opisujesz, jest powszechnie używane do implementacji przyrostowych kopii zapasowych.

sagi
źródło