Linux

¿Cómo comparar dos archivos de texto en el terminal Linux?

¿Necesita ver las diferencias entre dos revisiones de un archivo de texto? Entonces diff es el comando que necesitas. Este tutorial te muestra cómo usar diff en Linux y macOS de la manera más fácil.

Diversos comandos a tu disposición

El comando diff compara dos archivos y produce una lista de las diferencias entre los dos. Para ser más preciso, produce una lista de los cambios que se deben hacer al primer archivo, para que coincida con el segundo archivo. Si lo tienes en cuenta, te resultará más fácil entender la salida de diff.

El comando diff fue diseñado para encontrar diferencias entre archivos de código fuente y para producir una salida que pudiera ser leída y utilizada por otros programas, como el comando patch. En este tutorial, vamos a ver las formas más útiles y amigables para el ser humano de usar diff.

Vamos a sumergirnos y analizar dos archivos. El orden de los ficheros en la línea de comandos determina qué fichero diff considera que es el ‘primer fichero’ y cuál considera que es el ‘segundo fichero’. En el siguiente ejemplo, alpha1 es el primer archivo y alpha2 es el segundo. Ambos archivos contienen el alfabeto fonético pero el segundo archivo, alpha2, ha tenido alguna edición adicional para que los dos archivos no sean idénticos.

Podemos comparar los archivos con este comando. Escribe diff, un espacio, el nombre del primer archivo, un espacio, el nombre del segundo archivo y, a continuación, presiona Intro.

Linux

¿Cómo diseccionamos esa salida? Una vez que sabes qué buscar, no es tan malo. Cada diferencia se enumera a su vez en una sola columna, y cada diferencia se etiqueta.

La etiqueta contiene números a cada lado de una letra, como 4c4. El primer número es el número de línea en alpha1, y el segundo número es el número de línea en alpha2. La letra del medio puede ser:

c: La línea del primer archivo debe cambiarse para que coincida con la línea del segundo archivo.

d: La línea del primer archivo debe eliminarse para que coincida con el segundo archivo.

a: Se debe añadir contenido adicional al primer archivo para que coincida con el segundo archivo.

El 4c4 en nuestro ejemplo nos dice que la línea cuatro de alpha1 debe ser cambiada para que coincida con la línea cuatro de alpha2. Esta es la primera diferencia entre los dos archivos que difieren de los encontrados.

Las líneas que comienzan con < se refieren al primer archivo, en nuestro ejemplo alpha1, y las líneas que comienzan con > se refieren al segundo archivo, alpha2. La línea < Delta nos dice que la palabra Delta es el contenido de la línea cuatro en alpha1. La línea > Dave nos dice que la palabra Dave es el contenido de la línea cuatro en alpha2. Para resumir, tenemos que reemplazar Delta con Dave en la línea cuatro en alpha1, para hacer que esa línea coincida en ambos archivos.

El siguiente cambio está indicado por el 12c12. Aplicando la misma lógica, esto nos dice que la línea 12 en alpha1 contiene la palabra Lima, pero la línea 12 de alpha2 contiene la palabra Linux.

El tercer cambio se refiere a una línea que ha sido borrada de alpha2. La etiqueta 21d20 se descifra como «la línea 21 necesita ser borrada del primer archivo para hacer que ambos archivos se sincronicen a partir de la línea 20». La línea < Uniforme nos muestra el contenido de la línea que necesita ser borrada de alpha1.

La cuarta diferencia está marcada como 26a26,28. Este cambio se refiere a tres líneas adicionales que se han añadido a alpha2. Nota el 26,28 en la etiqueta. Los números de dos líneas separados por una coma representan un rango de números de línea.

En este ejemplo, el rango va de la línea 26 a la línea 28. La etiqueta se interpreta como «en la línea 26 del primer archivo, añada las líneas 26 a 28 del segundo archivo». Se nos muestran las tres líneas en alpha2 que necesitan ser añadidas a alpha1. Estos contienen las palabras Quirk, Strange y Charm.

Snappy One-Liners

Si lo único que quieres saber es si dos archivos son iguales, usa la opción -s (reportar archivos idénticos).

Linux

Puedes usar la opción -q (breve) para obtener una declaración igualmente concisa acerca de que dos archivos son diferentes.

Linux

Una cosa a tener en cuenta es que con dos archivos idénticos la opción-q (breve) se cierra completamente y no reporta nada en absoluto.

Una visión alternativa

La opción -y (lado a lado) utiliza un diseño diferente para describir las diferencias de archivo. A menudo es conveniente utilizar la opción -W (ancho) con la vista lado a lado. Para limitar el número de columnas que se muestran. Esto evita las feas líneas envolventes que dificultan la lectura de la salida. Aquí hemos dicho a diff que produzcas una visualización lado a lado y que limites la salida a 70 columnas.

El primer archivo de la línea de comandos, alpha1, se muestra a la izquierda y la segunda línea de la línea de comandos, alpha2, a la derecha. Las líneas de cada archivo se muestran una al lado de la otra. Hay caracteres indicadores junto a las líneas en alpha2 que han sido cambiadas, borradas o añadidas.

|: Una línea que se ha modificado en el segundo fichero.
<: Una línea que ha sido borrada del segundo archivo.

: Una línea que se ha añadido al segundo archivo que no está en el primer archivo.

Si prefieres un resumen más compacto de las diferencias de archivo, utiliza la opción –suppress-common-lines. Esto obliga a listar sólo las líneas modificadas, añadidas o eliminadas.

Linux

Añadir un toque de color

Otra utilidad llamada colordiff añade resaltado de color a la salida del diff. Esto hace que sea mucho más fácil ver qué líneas tienen diferencias.

Utilice apt-get para instalar este paquete en su sistema si estás utilizando Ubuntu u otra distribución basada en Debian. En otras distribuciones de Linux, usa en su lugar la herramienta de administración de paquetes de tu distribución de Linux.

Utiliza colordiff tal y como lo harías con diff.

De hecho, colordiff es una envoltura para diff, y diff hace todo el trabajo entre bastidores. Por eso, todas las opciones diff funcionarán con colordiff.

Proporcionando Algún Contexto par Linux

Para encontrar un término medio entre tener todas las líneas de los archivos mostrados en la pantalla y tener sólo las líneas modificadas en la lista, podemos pedir diff para proporcionar algo de contexto.

Hay dos maneras de hacerlo. Ambas formas logran el mismo propósito, que es mostrar algunas líneas antes y después de cada línea cambiada. Podrás ver lo que sucede en el archivo en el lugar donde se detectó la diferencia.

El primer método utiliza la opción -c (contexto copiado).

El mensaje de diferencias tiene una cabecera. La cabecera lista los dos nombres de archivo y sus tiempos de modificación. Hay asteriscos (*) antes del nombre del primer archivo y guiones (-) antes del nombre del segundo archivo. Se utilizarán asteriscos y guiones para indicar a qué archivo pertenecen las líneas de la salida.

Una línea de asteriscos con 1,7 en el centro indica que estamos viendo líneas desde alpha1. Para ser precisos, estamos viendo las líneas de la 1 a la 7. La palabra Delta está marcada como cambiada. Tiene un signo de exclamación (!) a su lado, y es rojo. Hay tres líneas de texto sin cambios que se muestran antes y después de esa línea para que podamos ver el contexto de esa línea en el archivo.

La línea de guiones con 1,7 en el centro nos dice que ahora estamos viendo líneas desde alpha2. De nuevo, estamos viendo las líneas de la 1 a la 7, con la palabra Dave en la línea 4 marcada como diferente.

Tres líneas de contexto por encima y por debajo de cada cambio es el valor por defecto. Puede especificar cuántas líneas de contexto desea que difieran. Para ello, utilice la opción -C (contexto copiado) con una «C» mayúscula y proporcione el número de líneas que desee:

La segunda opción diff que ofrece contexto es la opción -u (contexto unificado).

Como antes, tenemos un encabezado en la salida. Se nombran los dos archivos y se muestran sus tiempos de modificación. Hay guiones (-) antes del nombre de alfa1 y signos más (+) antes del nombre de alfa2.

Esto nos dice que los guiones se usarán para referirse a alfa 1 y los signos más se usarán para referirse a alfa 2. A lo largo de la lista hay líneas que comienzan con signos (@). Estas líneas marcan el inicio de cada diferencia. También nos dicen qué líneas se muestran de cada archivo.

Se nos muestran las tres líneas antes y después de la línea marcada como diferente para que podamos ver el contexto de la línea cambiada. En la vista unificada, las líneas con la diferencia se muestran una encima de la otra.

La línea de alfa1 está precedida por un guión y la línea de alfa2 está precedida por un signo más. Esta pantalla consigue en ocho líneas lo que la pantalla de contexto copiada anterior tardó quince minutos en hacer.

Como es de esperar, podemos pedir a diff que nos proporcione exactamente el número de líneas de contexto unificado que nos gustaría ver. Para ello, utiliza la opción -U (contexto unificado) con una «U» mayúscula y proporciona el número de líneas que desees:

Ignorando el espacio blanco en Linux

Analicemos otros dos archivos, test4 y test5. Estos tienen los nombres de seis superhéroes en ellos.

Los resultados muestran que diff no encuentra nada diferente con las líneas Black Widow, Spider-Man y Thor. Hace cambios con las líneas de Captain America, Ironman, y The Hulk.

Entonces, ¿qué es diferente? Bueno, en el test5 Hulk se escribe con una «h» minúscula, y el Capitán América tiene un espacio extra entre «Capitán» y «América».

Está bien, es fácil de ver, pero ¿qué tiene de malo la línea Ironman? No hay diferencias visibles. He aquí una buena regla empírica. Si no puedes verlo, la respuesta es un espacio en blanco. Es casi seguro que hay uno o dos espacios perdidos, o un carácter de tabulación, al final de esa línea.

Si no te importan, puedes ordenar a diff que ignore tipos específicos de diferencias de línea, incluyendo:

-i: Ignorar las diferencias en el caso.
-Z: Ignora los espacios en blanco que siguen.
-b: Ignora los cambios en la cantidad de espacio en blanco.
-w: Elide todos los cambios de espacio en blanco.

Pidamos a diff que revise esos dos archivos de nuevo, pero esta vez para ignorar cualquier diferencia en el caso.

Las líneas con «The Hulk» y «The hulk» ahora se consideran una coincidencia, y no hay ninguna diferencia para la «h» minúscula. Pidamos a diff que ignore también el espacio en blanco de arrastre.

Como se sospechaba, el espacio en blanco debe haber sido la diferencia en la línea Ironman porque diff ya no marca una diferencia para esa línea. Eso deja al Capitán América. Pidamos a diff que ignore el caso y que ignore todos los problemas de espacio en blanco.

Al decirle a diff que ignore las diferencias que no nos preocupan, diff nos dice que, para nuestros propósitos, los archivos coinciden.

El comando diff tiene muchas más opciones, pero la mayoría de ellas están relacionadas con la producción de salida legible por la máquina. Estos pueden ser revisados en la página de manual de Linux.

Las opciones que hemos utilizado en los ejemplos anteriores te permitirán rastrear todas las diferencias entre las versiones de sus archivos de texto, utilizando la línea de comandos y los globos oculares humanos.


¿Tienes alguna pregunta o problema relacionado con el tema del artículo? Queremos ayudarte.

Deja un comentario con tu problema o pregunta. Leemos y respondemos todos los comentarios, aunque a veces podamos tardar un poco debido al volumen que recibimos. Además, si tu consulta inspira la escritura de un artículo, te notificaremos por email cuando lo publiquemos.
*Moderamos los comentarios para evitar spam.

¡Gracias por enriquecer nuestra comunidad con tu participación!

Deja un comentario