diff con Bash

Comando diff para Linux

El comando diff de Linux se utiliza para comparar el contenido de dos archivos o directorios, especialmente para detectar modificaciones entre las versiones de nuestros archivos de texto y scripts.

Este comando es muy útil para el desarrollo de software y en el control de versiones.

diff [opciones] un_archivo otro_archivo

La mayoría de las veces las salidas que nos proporciona el comando diff en Bash son bastante extensas, por esta razón se recomienda redirigir la salida a un documento nuevo.

diff [opciones] un_archivo otro_archivo > documento_nuevo.txt

Recuerda que redirigir la salida con mayor que > crea un documento nuevo independientemente de si ya existe o no (si existe alguno con ese nombre lo sustituye). Cuando necesitamos actualizar un fichero ya existente podemos usar doble mayor que >> que actualizará el existente sin eliminarlo.

Vamos a ver un ejemplo sencillo comparando dos ficheros que tienen algunas líneas diferentes.

Antes de nada, usando el comando cp de Linux realizamos una copia del fichero lorem.txt con el nombre lorem2.txt y agregamos un par de líneas haciendo uso del doble mayor que >> para que existan diferencias entre los documentos.

cp lorem.txt lorem2.txt
echo "ppppp" >> lorem2.txt
echo "aaaaa" >> lorem2.txt

Si ahora ejecutamos el comando diff podemos ver que ha detectado las dos líneas de texto que hemos agregado al final en lorem2.txt.

diff lorem.txt lorem2.txt
Ejecutando el comando diff para entre dos ficheros de texto

Ahora vamos a agregar otra línea de texto al fichero lorem2.txt pero lo haremos al principio del todo. Para esto tendremos que hacer uso de un fichero temporal. Esto no tiene nada que ver con el uso del comando diff pero creo que viene bien practicarlo.

# Creo un fichero temporal nuevo con la línea
echo "Nueva línea" > temp.txt 

# Agrego el contenido de lorem2.txt al final del archivo temporal
cat lorem2.txt >> temp.txt

# Convierto a temporal en lorem2.txt
mv temp.txt lorem2.txt

Si ahora hacemos uso del comando head para ver las primeras líneas de lorem2.txt veremos que se agregó correctamente.

Agregando una línea a un fichero de texto en la primera posición con ayuda de un fichero temporal

Ahora volvemos a buscar las diferencias entre los dos ficheros y vemos que aparecen líneas nuevas en el resultado.

Ejecutando el comando diff para entre dos ficheros de texto

¿Pero qué significan estos valores que nos muestra la salida usando diff?

0a1
103a105,106

Vamos a realizar algunas modificaciones más en lorem2.txt y volvemos a ver qué resultado nos muestra la salida.

Ejecutando el comando diff para entre dos ficheros de texto
0a1
> Nueva Línea
10c11
< bar el 
---
> bar es 
12c13
< de insertar el texto final.
---
> insertar el texto final.
103a105,106
> ppppp
> aaaaa

Vamos a desgranar diferencia a diferencia.
Aunque antes de nada lo primero que debemos saber es que las estructuras de este tipo 0a1 significan lo siguiente.
→ 0a1
El primer valor (0) a la izquierda de la letra (a) hace referencia al fichero origen (lorem.txt), la letra (a) al tipo de diferencia encontrada y el segundo valor (1) al fichero destino (lorem2.txt).

0a1
> Nueva Línea

Agregamos la línea nueva.
Esto nos indica una adición (addition). Significa que «Nueva Línea» fue agregado en la línea 1 del archivo lorem2.txt y no existía en el archivo lorem.txt. El símbolo mayor que > indica adición.

10c11
< bar el 
---
> bar es 

Cambio realizado: «bar el» por «bar es».
Esto nos indica una modificación (change). Significa que la línea «bar el» en el archivo lorem.txt fue modificada por «bar es» en lorem2.txt. El símbolo menor que < indica la versión anterior y el mayor que > la versión modificada.

12c13
< de insertar el texto final.
---
> insertar el texto final.

Cambio realizado: «de insertar el texto final.» por «insertar el texto final.».
Esto nos está indicando otra modifcación (change). Significa que la línea «de insertar el texto final.» en el archivo lorem.txt ha sido modificada a «insertar el texto final.» en lorem2.txt.
El símbolo menor que < indica la versión anterior y el mayor que > la versión modificada.

103a105,106
> ppppp
> aaaaa

Agrego las últimas líneas.
Esto nos indica una adición (addition). Hace referencia que las líneas «ppppp» y «aaaaa» han sido agregadas en las líneas 105 y 106 de lorem2.txt. La línea 103 del archivo de origen (lorem.txt) no está relacionada con esta adición.

Opciones de diff con Bash

De la misma forma que con el resto de comandos de Linux, diff tiene sus propias opciones que lo hacen más potente. Puedes ver todas las que hay disponibles consultando la ayuda en la terminal man diff.

  • -u: muestra las diferencias existentes en formato unificado, mostrando las líneas contextuales alrededor de las diferencias.
  • -c: muestra las diferencias en formato de contexto.
  • -r: realiza una comparación de archivos de forma recursiva incluyendo directorios y subdirectorios.
  • -q: muestra resumen corto de si los ficheros tienen diferencias, sin detalles.

Podemos utilizar la variable especial $? para ver si existen diferencias entre dos ficheros. Sin olvidar que esta variable especial contiene el código de salida del comando más reciente que se ejecutó. Si ejecutamos otro comando en el medio no estaría mostrando el resultado correcto que buscamos.

Derivaremos el resultado del comando diff a la ubicación «/dev/null» para mostrar solo el código de salida. Esta ubicación especial «/dev/null» nos permite descartar datos de forma inmediata, no se almacenan en ningún lugar, tampoco se muestran.

diff lorem.txt lorem2.txt > /dev/null
echo "Código de salida: $?"
Mostrando solo el código de salida después de ejecutar el comando diff. Los datos son enviados a /dev/null

Si el código de salida es 1 es que existen diferencias, si el código de salida es 0 es que no existen diferencias.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *