¿Obtener rsync para generar un archivo de parche en lugar de copiarlo entre archivos?

19

Estoy copiando muchos archivos que han cambiado de un servidor a otro usando rsync. Sé que puedo usar la -nopción para hacer una ejecución en seco, por lo que puedo ver qué archivos se han cambiado. Sin embargo, ¿es posible obtener rsync para imprimir una diferencia del contenido del archivo que ha cambiado? ¿Me gustaría ver qué sucede antes de hacer una copia? ¿Algo que pueda guardar en un archivo y aplicar con diff (1) más adelante?

Rory
fuente

Respuestas:

8

Puede haber una mejor manera, pero esto podría funcionar, aunque no tan eficientemente:

 rsync -vrn / dest:/ > ~/file_list

Luego edite la prueba para eliminar las estadísticas, luego:

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

Otra opción:
También puede considerar montar el sistema de archivos con algo como sshfs / fuse, y luego simplemente usar diff.

Kyle Brandt
fuente
Nota: No probé esos comandos ;-)
Kyle Brandt
Buen comienzo, pero de allí cargas de producción adicional de rsync, tales como las estadísticas, y "el envío de la lista de archivos incremental", etc
Rory
Puede usar --out-format = "% f"
Kyle Brandt el
Si se utiliza el formato de fuera, la caída de la v, y grep -v 'saltar archivo no regular' ... Eso ayudaría bastante limpia
Kyle Brandt
Solo comprobando si por casualidad hay un método nuevo / mejor para rsync --diffdos años después ...
Anillo Ø
2

rsync no puede hacer esto de forma nativa, pero si existe la posibilidad de usar unísono , puede producir un formato de estilo diff a partir de eso.

Philip Reynolds
fuente
1

No es posible de forma nativa porque rsync solo se preocupa por las diferencias binarias entre los archivos.

Es posible que pueda escribirlo, utilizando la salida de rsync. Pero sería hackish.

Sin embargo, creo que es nativamente posible con Unison .

Dan Carley
fuente
1
¿Es mío lo que quisiste decir con hackish? :-)
Kyle Brandt
Absolutamente, Kyle: D
Dan Carley
1

¿Por qué no usar algo como diff (para archivos de texto) o xdelta (para archivos binarios) para generar los diffs? ¿Por qué necesita obtener algo específicamente de rsync?

womble
fuente
No necesito RSYNC, pero necesito estar a distancia
Rory
Oh no, ssh!
womble
1

Para ampliar la respuesta de Kyle, esto automatiza el proceso. Tenga en cuenta que está totalmente sin probar, probablemente bastante frágil, y puede eliminar su computadora y matar a su perro.

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

El algoritmo rsync funciona comparando fragmentos binarios del archivo. Tal diferencia binaria no está destinada a ser imprimible. Hay un comando llamado rdiff que usa el algoritmo rsync para generar un diferencial binario, pero no creo que sea útil para lo que describe, se usa comúnmente para implementar copias de seguridad incrementales.

sagi
fuente