Ottieni rsync per generare un file patch invece di copiarlo tra i file?


19

Sto copiando molti file che sono cambiati da un server all'altro usando rsync. So che posso usare l' -nopzione per eseguire una corsa a secco, quindi posso vedere quali file sono stati modificati. Tuttavia è possibile ottenere rsync per stampare un diff del contenuto del file che è cambiato? Mi piacerebbe vedere cosa sta succedendo prima di fare una copia? Qualcosa che posso salvare in un file e applicare con diff (1) in seguito?

Risposte:


8

Potrebbe esserci un modo migliore, ma potrebbe funzionare, anche se non in modo efficiente:

 rsync -vrn / dest:/ > ~/file_list

Quindi modifica il test per rimuovere le statistiche, quindi:

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

Un'altra opzione:
potresti anche considerare di montare il file system con qualcosa come sshfs / fuse, e quindi usare semplicemente diff.


Nota: non ho testato quei comandi ;-)
Kyle Brandt

Buon inizio, ma c'è un sacco di output extra da rsync, come le statistiche e "l'invio di un elenco di file incrementale", ecc.
Rory,

Puoi usare --out-format = "% f"
Kyle Brandt

Se usi il formato out, rilascia la v e grep -v 'salta il file non regolare' ... Questo dovrebbe renderlo abbastanza pulito
Kyle Brandt

Sto solo verificando se per caso esiste un metodo nuovo / migliore per rsync --diffdue anni dopo ...
Anello Ø

2

rsync non può farlo in modo nativo, ma se c'è la possibilità di usare l' unisono puoi produrre un formato di stile diff da quello.



1

Non è possibile in modo nativo perché rsync si preoccupa solo delle differenze binarie tra i file.

Potresti essere in grado di copiarlo, usando l'output di rsync. Ma sarebbe hacker.

Credo che sia possibile nativamente con Unison .


1
Il mio è ciò che intendevi per hackish? :-)
Kyle Brandt

Assolutamente, Kyle: D
Dan Carley,

1

Perché non usare semplicemente qualcosa come diff (per file di testo) o xdelta (per file binari) per generare i diff? Perché hai bisogno di ottenere qualcosa in modo specifico da rsync?


Non ho bisogno di rsync, ma deve essere remoto
Rory,

Oh no, ssh!
Womble

1

Per espandere la risposta di Kyle, questo automatizza il processo. Si noti che è totalmente non testato, probabilmente piuttosto fragile e può eliminare il computer e uccidere il cane.

#!/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

L'algoritmo rsync funziona confrontando blocchi binari del file. Tale diff binario non è pensato per essere stampabile. Esiste un comando chiamato rdiff che utilizza l'algoritmo rsync per generare un diff binario, ma non penso che sarebbe utile per quello che descrivi, è comunemente usato per implementare backup incrementali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.