Luego de consultar especialistas en el tema, programadores de deferentes ramas y maestros dimos con la solución al dilema y la dejamos plasmada en este post.
Solución:
Para la segunda aplicación/problema, usaría un programa de respaldo de deduplicación como restic
o borgbackup
, en lugar de intentar realizar un seguimiento manual de “parches” o diferencias. Él restic
El programa de copia de seguridad le permite hacer una copia de seguridad de los directorios de varias máquinas en el mismo repositorio de copia de seguridad, deduplicando los datos de la copia de seguridad tanto entre fragmentos de archivos de una máquina individual como entre máquinas. (No tengo experiencia de usuario con borgbackup
así que no puedo decir nada sobre ese programa).
Cálculo y almacenamiento de una diferencia de la abc
y abc2
Los archivos se pueden hacer con rsync
.
Este es un ejemplo con abc
y abc2
siendo 153 MB. El archivo abc2
se ha modificado sobrescribiendo los primeros 2,3 MB del archivo con algunos otros datos:
$ ls -lh
total 626208
-rw-r--r-- 1 kk wheel 153M Feb 3 16:55 abc
-rw-r--r-- 1 kk wheel 153M Feb 3 17:02 abc2
Creamos nuestro parche para transformar abc
en abc2
y llámalo abc-diff
:
$ rsync --only-write-batch=abc-diff abc2 abc
$ ls -lh
total 631026
-rw-r--r-- 1 kk wheel 153M Feb 3 16:55 abc
-rw------- 1 kk wheel 2.3M Feb 3 17:03 abc-diff
-rwx------ 1 kk wheel 38B Feb 3 17:03 abc-diff.sh
-rw-r--r-- 1 kk wheel 153M Feb 3 17:02 abc2
El archivo generado abc-diff
es la diferencia real (su “archivo de parche”), mientras que abc-diff.sh
es un breve script de shell que rsync
crea para ti:
$ cat abc-diff.sh
rsync --read-batch=abc-diff $1:-abc
Este script modifica abc
para que sea idéntico a abc2
dado el archivo abc-diff
:
$ md5sum abc abc2
be00efe0a7a7d3b793e70e466cbc53c6 abc
3decbde2d3a87f3d954ccee9d60f249b abc2
$ sh abc-diff.sh
$ md5sum abc abc2
3decbde2d3a87f3d954ccee9d60f249b abc
3decbde2d3a87f3d954ccee9d60f249b abc2
El archivo abc-diff
ahora podría transferirse a cualquier otro lugar que tenga abc
. con el comando rsync --read-batch=abc-diff abc
aplicarías el parche al archivo abc
transformando su contenido para que sea el mismo que el abc2
archivo en el sistema donde creó el diff.
Volver a aplicar el parche por segunda vez parece seguro. No hay mensajes de error ni cambia el contenido del archivo (la suma de comprobación MD5 no cambia).
Tenga en cuenta que, a menos que cree un “parche inverso” explícito, no hay forma de deshacer fácilmente la aplicación del parche.
También probé escribiendo la modificación de 2.3 MB en algún otro lugar en el abc2
datos, un poco más adentro (alrededor de 50 MB), así como al principio. El “parche” generado tenía un tamaño de 4,6 MB, lo que sugiere que solo los bits modificados se almacenaron en el parche.
¿Cómo calcular una diferencia binaria de abc y abc2?
Usando bsdiff/bspatch o xdelta y otros.
$ bsdiff older newer patch.bin # patch.bin is created
[...]
$ bspatch older newer patch.bin # newer is created
Sin embargo, se deben tener en cuenta estas advertencias de las páginas del manual:
bsdiff
utiliza una memoria equivalente a 17 veces el tamaño de archivo antiguoy requiere un tamaño de conjunto de trabajo mínimo absoluto de 8 veces el tamaño de archivo antiguo.bspatch
usa memoria igual al tamaño de archivo antiguo más el tamaño de archivo nuevopero puede tolerar un conjunto de trabajo muy pequeño sin una pérdida dramática de rendimiento.
¿Has probado a forzar diff
para tratar los archivos como texto:
diff -ua abc abc2
Como se explica aquí.
-u
salida NUM (predeterminado 3) líneas de contexto unificado-a
tratar todos los archivos como texto
Esto debería conseguirte un parche. La desventaja de esto es que las ‘líneas’ pueden ser bastante largas y eso podría inflar el parche.
Agradecemos que quieras añadir valor a nuestro contenido colaborando tu veteranía en las interpretaciones.