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)?

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.


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.



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 .


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?


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')

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.

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.