¿La mejor manera de comparar (diff) una estructura de directorio completa?

29

¿Cuál es la mejor manera de comparar estructuras de directorios?

Tengo una utilidad de respaldo que usa rsync . Quiero decir las diferencias exactas (en términos de tamaños de archivo y fechas de último cambio) entre la fuente y la copia de seguridad.

Algo como:

Local file                   Remote file                         Compare
/home/udi/1.txt (date)(size)   /home/udi/1.txt (date)(size)     EQUAL
/home/udi/2.txt (date)(size)   /home/udi/2.txt (date)(size)     DIFFERENT

Por supuesto, la herramienta puede estar lista para usar o ser una idea para un script de Python.

¡Muchas gracias!

Udi

Adam Matan
fuente

Respuestas:

18

La herramienta que estás buscando es rdiff . Funciona como combinar rsync y diff. Crea un archivo de parche que puede comparar o distribuir.

brianegge
fuente
9

Algunas personas quieren comparar sistemas de archivos por diferentes razones, así que escribiré aquí lo que quería y cómo lo hice.

Quise:

  • Para comparar el mismo sistema de archivos consigo mismo, es decir, instantánea , hacer cambios , instantánea , comparar .
  • Una lista de los archivos que se agregaron o eliminaron, no le importaron los cambios internos de archivos.

Lo que hice:

Primera instantánea ( before.shscript):

find / -xdev | sort > fs-before.txt

Segunda instantánea ( after.shscript):

find / -xdev | sort > fs-after.txt

Para compararlos ( diff.shscript):

diff -daU 0 fs-before.txt fs-after.txt | grep -vE '^(@@|\+\+\+|---)'

Lo bueno es que esto usa binarios del sistema por defecto. Hacer que se compare en función del contenido podría hacerse pasando findun -execparámetro que repitiera la ruta del archivo y un MD5 después de eso.

Camilo Martin
fuente
8

si no tienes ganas de instalar otra herramienta ...

for host in host1 host2
do
  ssh $host ' 
  cd /dir &&
  find . |
  while
    read line
  do
    ls -l "$line"
  done ' | sort  > /tmp/temp.$host.$$
done
diff /tmp/temp.*.$$ | less
echo "don't forget to clean up the temp files!"

Y sí, podría hacerse con find y exec o find y xargs tan fácilmente como find en un bucle for. Y, además, puede aumentar la salida de diff para que diga cosas como "este archivo está en host1 pero no host2" o algo así, pero en ese momento también puede instalar las herramientas de las que todos los demás están hablando ...

Chris
fuente
5

He usado dirdiff en el pasado para comparar estructuras de directorios. Solo funciona en sshfsdirectorios locales, por lo que tendrá que montar sus otros directorios.

Lo bueno es que puede ver visualmente si los archivos son iguales o no y cuál es más nuevo o más antiguo. Y es compatible con hasta 5 directorios. También puede ver las diferencias y copiar archivos de uno a otro.

chmeee
fuente
4

Desde la página del manual de rsync:

-n, --dry-run
This  makes rsync perform a trial run that doesn’t make any changes (and produces mostly
the same output as a real run).  It is most commonly used in combination  with  the  -v,
--verbose  and/or -i, --itemize-changes options to see what an rsync command is going to
do before one actually runs it.

Tal vez esto ayude.

Saurabh Barjatiya
fuente
Gracias, pero no resuelve mi problema (estoy buscando la diferencia para decir realmente las diferencias).
Adam Matan el
4

diff -rEn realidad funciona bastante bien. Si solo desea saber si los archivos difieren, no el contenido real de las diferencias, entonces hágalodiff -qr

AlexB
fuente
1
-rsignifica recursivo, ¡no se conecta a un host remoto!
Michael Hampton
3

Usaría Meld para eso.

pupeno
fuente
Meld funciona muy bien para esto si quieres una solución GUI.
Drew Noakes
2

Además de las herramientas ya mencionadas en Windows, podría usar Total Commander o WinSCP, ambas tienen funciones muy cómodas para comparar (y sincronizar) directorios.


fuente
0

Realmente no quería instalar nada nuevo, por lo que mi solución es un poco tosca, pero rápida y efectiva.

Quería comparar todos los archivos que se han copiado y su modo de archivo, propiedad y contexto de seguridad de SELinux permanecen sin cambios.

Entonces corrí:

rsync -aX /orig /copy/

y luego compara así:

cd /orig && ls -lZR > /tmp/diff_orig
cd /copy && ls -lZR > /tmp/diff_copy
vimdiff /tmp/diff_*

Si el contenido de ambos archivos permanece colapsado, son idénticos. Si no, se muestra la diferencia.

Actualice los parámetros lspara reflejar los atributos que necesita verificar. YMMV

helvete
fuente