Cómo comparar dos archivos de texto en la terminal de Linux

Contenidos

Ilustración de una ventana de terminal en Linux

¿Necesita ver las diferencias entre dos revisiones de un archivo de texto? Posteriormente diff es el comando que necesitas. Este tutorial le muestra cómo utilizar diff en Linux y macOS, la forma más sencilla.

Buceando en diff

los diff El comando compara dos archivos y produce una lista de las diferencias entre los dos. Para ser más preciso, genera una lista de los cambios que se deben realizar en el primer archivo para que coincida con el segundo archivo. Si tiene esto en cuenta, le resultará más fácil comprender el resultado de diff. los diff El comando fue diseñado para hallar diferencias entre archivos de código fuente y producir una salida que pudiera ser leída y actuada por otros programas, como el parche mando. En este tutorial, veremos las formas más útiles y amigables para los humanos de utilizar diff.

Vamos a sumergirnos y analizar dos archivos. El orden de los archivos en la línea de comando determina qué archivo diff considera que es el «primer archivo» y que considera que es el «segundo archivo». En el siguiente ejemplo, alpha1 es el primer archivo y alpha2 es el segundo archivo. Ambos archivos contienen el alfabeto fonetico pero el segundo archivo, alpha2, tuvo algunas modificaciones adicionales 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 después presione Entrar.

diff alpha1 alpha2

Salida del comando diff sin opciones

¿Cómo diseccionamos ese resultado? Una vez que sepa qué buscar, no estará tan mal. Cada diferencia se enumera a su vez en una sola columna y cada diferencia está etiquetada. La etiqueta contiene números a ambos lados 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 agregar contenido adicional al primer archivo para que coincida con el segundo archivo.

los 4c4 en nuestro ejemplo, díganos que la línea cuatro de alpha1 debe cambiarse para que coincida con la línea cuatro de alpha2. Ésta es la primera diferencia entre los dos archivos que diff fundar.

Líneas que comienzan con < consulte el primer archivo, en nuestro ejemplo alpha1, y las líneas que comienzan con > consulte el 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. Entonces, para resumir, necesitamos reemplazar Delta con Dave en la línea cuatro en alpha1, para 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 se ha eliminado de alpha2. La etiqueta 21d20 se descifra como «la línea 21 debe eliminarse del primer archivo para que ambos archivos se sincronicen desde la línea 20 en adelante». los < Uniform line nos muestra el contenido de la línea que debe eliminarse de alpha1.

La cuarta diferencia está etiquetada 26a26,28. Este cambio se refiere a tres líneas adicionales que se han incorporado a alpha2. Nota la 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 28. La etiqueta se interpreta como «en la línea 26 del primer archivo, agregue las líneas 26 a 28 del segundo archivo». Se nos muestran las tres líneas en alpha2 que deben agregarse a alpha1. Estos contienen las palabras Quirk, Strange y Charm.

Rápidos de una sola línea

Si todo lo que desea saber es si dos archivos son iguales, utilice el -s (reportar archivos idénticos) opción.

diff -s alpha1 alpha3

Salida del comando diff con la opción -s

Puedes utilizar el -q (breve) opción para obtener una declaración igualmente concisa sobre dos archivos que son diferentes.

diff -q alpha1 alpha2

Salida del comando diff con la opción -q

Una cosa a prestar atención es que con dos archivos idénticos el-q La opción (breve) se cierra por completo y no informa nada en absoluto.

Una vista alternativa

los -y (lado a lado) utiliza un diseño distinto para describir las diferencias de archivo. A menudo es conveniente usar el -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í lo hemos dicho diff para producir una visualización lado a lado y limitar la salida a 70 columnas.

diff -y -W 70 alpha1 alpha2

Salida del comando diff con visualización lado a lado

El primer archivo de la línea de comando, alpha1, se muestra a la izquierda y la segunda línea de la línea de comando, alpha2, se muestra a la derecha. Las líneas de cada archivo se muestran, una al lado de la otra. Hay caracteres indicadores junto a esas líneas en alpha2 que se han cambiado, eliminado o agregado.

  • |: Una línea que se ha cambiado en el segundo archivo.
  • <: Una línea que se ha eliminado del segundo archivo.
  • >: Una línea que se ha agregado al segundo archivo que no está en el primer archivo.

Si prefiere un resumen paralelo más compacto de las diferencias de archivo, utilice el --suppress-common-lines opción. Esto fuerza diff para enumerar solo las líneas modificadas, agregadas o eliminadas.

diff -y -W 70 --suppress-common-lines alpha1 alpha2

Salida del comando diff con la opción --suppress-common-lines

Añade un toque de color

Otra utilidad llamada colordiff agrega resaltado de color a la diff producción. Esto hace que sea mucho más fácil ver qué líneas disponen diferencias.

Utilizar apt-get para instalar este paquete en su sistema si está usando Ubuntu u otra distribución basada en Debian. En otras distribuciones de Linux, utilice la herramienta de administración de paquetes de su distribución de Linux.

sudo apt-get install colordiff

Utilizar colordiff tal como lo utilizarías diff.

Salida del comando colordiff sin opciones

En realidad, colordiff es un envoltorio para diff, y diff hace todo el trabajo detrás de escena. Es por ello que, todos los diff las alternativas funcionarán con colordiff.

Salida del comando colordiff con la opción --suppress-common-lines

Proporcionar algo de contexto

Para hallar una definición medio entre tener todas las líneas en los archivos mostrados en la pantalla y tener solo las líneas cambiadas en el listado, podemos preguntar diff para proporcionar algo de contexto. Hay dos maneras de hacer esto. Ambas formas logran el mismo propósito, que es mostrar algunas líneas antes y después de cada línea modificada. Podrá ver lo que está sucediendo en el archivo en el lugar donde se detectó la diferencia.

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

colordiff -c alpha1 alpha2

Salida de colordiff con opción -c

los diff la salida tiene un encabezado. El encabezado enumera 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 medio indica que estamos viendo líneas de alpha1. Para ser precisos, estamos viendo las líneas uno a siete. La palabra Delta se marca como modificada. Tiene un signo de exclamación ( ! ) junto a él, y es rojo. Se muestran tres líneas de texto sin cambios 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 medio nos dice que ahora estamos viendo líneas de alpha2. Nuevamente, estamos viendo las líneas uno a siete, con la palabra Dave en la línea cuatro marcada como distinto.

Tres líneas de contexto por encima y por debajo de cada cambio es el valor predeterminado. Puede especificar cuántas líneas de contexto desea diff Para proveer. Para hacer esto, use el -C (contexto copiado) con una «C» mayúscula y proporcione el número de líneas que desea:

colordiff -C 2 alpha1 alpha2

Salida de colordiff con opción -C 2

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

colordiff -u alpha1 alpha2

Salida de colordiff con opción -u

Como antes, tenemos un encabezado en la salida. Los dos archivos se nombran y se muestran sus tiempos de modificación. Hay guiones (-) antes del nombre de alpha1 y los signos más (+) antes del nombre de alpha2. Esto nos dice que los guiones se usarán para referirse a alpha1 y los signos más se usarán para referirse a alpha2. Dispersas a lo largo de la lista hay líneas que comienzan con signos (@). Estas líneas marcan el inicio de cada diferencia. Además 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 distinto para que podamos ver el contexto de la línea modificada. En la vista unificada, las líneas con la diferencia se muestran una encima de la otra. La línea de alpha1 está precedida por un guión y la línea de alpha2 está precedida por un signo más. Esta pantalla logra en ocho líneas lo que la pantalla de contexto copiada de arriba tardó quince en hacer.

Como podíamos esperar, podemos preguntar diff para proporcionar exactamente el número de líneas de contexto unificado que nos gustaría ver. Para hacer esto, use el -U (contexto unificado) con una «U» mayúscula y proporcione la cantidad de líneas que desea:

colordiff -U 2 alpha1 alpha2

Salida de colordiff con opción -U 2

Ignorar el espacio en blanco y el caso

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

colordiff -y -W 70 test4 test5

Salida de colordiff en archivos test4 y test5

Los resultados muestran que diff no encuentra nada distinto con las líneas Black Widow, Spider-Man y Thor. Señala cambios con las líneas Capitán América, Ironman y Hulk.

Entonces, ¿qué es distinto? Bueno, en test5, Hulk se escribe con una «h» minúscula y el Capitán América tiene un espacio adicional entre «Capitán» y «América». Está bien, eso es fácil de ver, pero ¿qué pasa con la línea Ironman? No hay diferencias visibles. Aquí tienes una buena regla general. Si no puede verlo, la solución es un espacio en blanco. Es casi seguro que haya un espacio perdido o dos, o un carácter de tabulación, al final de esa línea.

Si no te importan, puedes instruir diff para ignorar tipos específicos de diferencia de línea, que incluyen:

  • -I: Ignore las diferencias entre mayúsculas y minúsculas.
  • -Z: Ignora los espacios en blanco finales.
  • -B: Ignora los cambios en la cantidad de espacio en blanco.
  • -w: Ignora todos los cambios de espacios en blanco.

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

colordiff -i -y -W 70 test4 test5

salida de colordiff ignorar mayúsculas y minúsculas

Las líneas con «The Hulk» y «The Hulk» ahora se consideran una coincidencia, y no se marca ninguna diferencia para la «h» minúscula. Preguntemos diff para ignorar además los espacios en blanco finales.

colordiff -i -Z -y -W 70 test4 test5

La salida de colordiff ignora los espacios en blanco finales

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

colordiff -i -w -y -W 70 test4 test5

La salida de colordiff ignora todos los espacios en blanco

Contando diff ignorar las diferencias que no nos preocupan, diff nos dice que, para nuestros propósitos, los archivos coinciden.

los diff El comando tiene muchas más opciones, pero la mayoría de ellas se relacionan con la producción de resultados legibles por máquina. Estos se pueden revisar en Linux página man. Las alternativas que hemos usado en los ejemplos anteriores le permitirán rastrear todas las diferencias entre las versiones de sus archivos de texto, usando la línea de comando y los ojos humanos.

setTimeout(function(){
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version=’2.0′;
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s) } (window, document,’script’,
‘https://connect.facebook.net/en_US/fbevents.js’);
fbq(‘init’, ‘335401813750447’);
fbq(‘track’, ‘PageView’);
},3000);

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.