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

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.


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.



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 .


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?


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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.