Realizando comparaciones recursivas de directorios con colordiff

Entre los administradores es tarea habitual realizar comparaciones de ficheros para determinar qué parte del contenido cambia entre versiones, backups, etc… Si tenemos un grupo de ficheros o directorios enteros a comprar, podemos también realizarlo sin demasiadas complicaciones.

En Windows o escritorios Linux contamos con herramientas visuales que nos facilitan bastante la vida como Meld, Diffuse, Kompare o WinMerge. Para terminal en Linux, tenemos diff aunque para facilitar la lectura de la salida yo recomendaría colordiff. Podéis instalarlo fácilmente en con vuestra herramienta de paquetería según corresponda:

apt-get install colordiff
yum install colordiff

Si por alguna razón no podéis instalar colordiff en vuestro sistema, los ejemplos de este artículo sirven igualmente.

Pongamos por caso que tenemos una versión de Tomcat 7.0.30 y queremos actualizar a 7.0.72. Evidentemente cambiarán ficheros de configuración y librerías, por lo que tendremos que saber qué partes tendremos que modificar en el upgrade a realizar. Nos descargaremos ambas versiones, desempaquetaremos y haremos la comparación posterior entre ambas versiones:

wget https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.72/bin/apache-tomcat-7.0.72.tar.gz
wget https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.30/bin/apache-tomcat-7.0.30.tar.gz
tar -zxvf apache-tomcat-7.0.72.tar.gz
tar -zxvf apache-tomcat-7.0.30.tar.gz

Por cuestión de orden en nuestro proceso de comparación querremos saber por tanto:

  • Ficheros que son iguales.
  • Ficheros que sólo están en un directorio y no en otro.
  • Ficheros que son distintos.

Detectando ficheros idénticos que no tienen cambios (idénticos)

Podemos descartar los ficheros que no tienen ningún cambio de la siguiente manera, donde la opción -s indica que se muestren los ficheros idénticos y -r que el diff se haga recursivo:

colordiff -sr  apache-tomcat-7.0.30 apache-tomcat-7.0.72 | grep identical

Obtendremos entonces una lista con los ficheros que son idénticos:

Ficheros que sólo están en una versión

En este caso queremos detectar qué ficheros están en la versión 7.0.30 pero no en la 7.0.72.

Por ejemplo, para ver los que sólo están en 7.0.30 realizaremos lo siguiente:

colordiff -EZBwr apache-tomcat-7.0.30 apache-tomcat-7.0.72 | grep -i only | grep 7.0.30

Las opciones utilizadas:

  • -E ignorar tabulaciones
  • -Z ignorar espacio en blanco al final de línea
  • -B ignorar líneas en blanco
  • -w ignorar espacios en blanco

Por el contrario, para ver los ficheros que únicamente aparecen en la versión 7.0.72:

colordiff -EZBwr apache-tomcat-7.0.30 apache-tomcat-7.0.72 | grep -i only | grep 7.0.72

Ficheros que contienen diferencias

Podemos ver qué ficheros tienen diferencias incluyendo la opción -q:

colordiff -EZBqwr apache-tomcat-7.0.30 apache-tomcat-7.0.72 | grep differ


Ahora bien, para ver el contenido de esas diferencias fichero por fichero quitaremos la opción -q

colordiff -EZBwr apache-tomcat-7.0.30 apache-tomcat-7.0.72

Obtendremos entonces las comparaciones fichero a fichero mostrando en cada caso las diferencias de contenido, por ejemplo:

Para estas tareas pienso que siempre es más cómodo contar con una herramienta visual, en particular mi preferida es Meld, pero desde terminal podemos realizar también todas las comparaciones necesarias como hemos podido ver.