Supongamos que tenemos un directorio con algunos cientos de gigabytes de archivos, en un servidor en producción, y necesitamos contrastar rápidamente la diferencia contra un backup previo, para saber qué archivos faltan y cuáles son nuevos. Al tratarse de un sistema en producción, no vamos a querer "sacudirle" a los discos examinando el contenido de los archivos uno por uno, especialmente si no necesitamos gran precisión en los resultados. Sólo queremos comparar ambos directorios por nombre de archivo, sin importar las fechas de modificación ni su contenido (checksums).

Este artículo explica cómo comparar dos árboles de directorio en Linux según los nombres de los archivos, sin examinar el contenido de los mismos.

Para comparar directorios en sistemas operativos de la familia Unix típicamente se utiliza la herramienta diff:

diff -qr dir1/ dir2/

Sin embargo, diff examina el contenido de los archivos (línea por línea, si son archivos de texto) para determinar si son diferentes. Suponiendo que el tamaño total utilizado por los archivos en cada árbol de directorio es de aproximadamente 500 GB, esto significa que estaríamos potencialmente leyendo de disco casi 1 TB. Por supuesto esta operación, además de aniquilar el rendimiento de los discos para el resto de las aplicaciones, demoraría un tiempo considerable.

Si no se necesita gran precisión respecto a los cambios en el contenido de los archivos, por ejemplo sólo se necesita saber si un archivo está presente o no en cada árbol de directorio, es posible recurrir a la siguiente operación:

  1. Generar un archivo con el listado de todos los archivos para cada árbol de directorio.
  2. Comparar ambos listados.

Un ejemplo

Se necesita comparar los directorios /var/www/linuxito.com/ y /var/www/testing.linuxito.com/.

Generar el listado de todos los archivos de /var/www/linuxito.com/:

root@debian# cd /var/www/linuxito.com/ && find . -type f > /tmp/prod.txt

Generar el listado de todos los archivos de /var/www/testing.linuxito.com/:

root@debian# cd /var/www/testing.linuxito.com/ && find . -type f > /tmp/test.txt

Finalmente, comparar ambos archivos (prod.txt vs. test.txt):

root@debian# diff /tmp/prod.txt /tmp/test.txt
115c115
< ./lib/DataBase.class.php.borrar
---
> ./index2.php

De la comparación se concluye que en el directorio /var/www/linuxito.com/ falta el archivo ./lib/DataBase.class.php.borrar, y en el directorio /var/www/testing.linuxito.com/ falta el archivo index2.php.

Una vez más, esto no significa que el resto de los archivos sean idénticos entre ambos árboles de directorio, sólo indica qué archivos tiene uno que no posea el otro. Estamos comparando sólo a nivel nombre de archivo.

Esta operación lleva apenas unos segundos (dependiendo principalmente de la cantidad de archivos en cada árbol, no su tamaño) pero siempre es muchísimo más rápida, pues no se accede al contenido de los archivos en cada jerarquía de directorios.

Referencias

man find
man diff


Tal vez pueda interesarte


Compartí este artículo