Cómo comparar archivos usando DIFF

Cómo comparar archivos usando DIFF

La utilidad DIFF está, en la gran mayoría de los casos, instalada de forma predeterminada en cada distribución de Linux. El programa se utiliza para calcular y mostrar las diferencias entre el contenido de dos archivos. Se usa principalmente cuando se trabaja con el código fuente dos comparan las mismas versiones de dos archivos y resalta las diferencias entre ellos. En este artículo aprenderemos los diversos modos en los que la diferencia puede funcionar y cómo crear un archivo DIFF que luego se puede aplicar como un parche con la utilidad del parche.

En este tutorial aprenderás:

  • Cómo usar Diff
  • Cómo mostrar la salida de Diff en dos columnas cuando se usa Diff en modo normal
  • Cómo leer la salida Diff en modo normal, contexto y unificado
  • Cómo crear un archivo DIFF y aplicarlo como un parche con la utilidad del parche
Cómo comparar archivos usando DIFF

Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Distribución independiente
Software Diferencia, parche
Otro Ninguno
Convenciones # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
$-Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado

La utilidad diff

El diferencia La utilidad compara archivos línea por línea; Su sintaxis es muy simple:

$ diff [opción] archivos 

Todo lo que tenemos que hacer es invocar el programa seguido de la ruta de los archivos que queremos comparar. Antes de que podamos echar un vistazo a algunos ejemplos de uso, necesitamos aprender a leer la salida de la utilidad y cuál es el significado de los símbolos utilizados en la salida producida por él. Podemos resumirlos en la siguiente tabla:

Símbolo Significado
a Se necesita una "adición" para que el contenido de los dos archivos coincida
C Se necesita una acción de "cambio" para que el contenido de los dos archivos coincida
d Se necesita una acción de "eliminar" para que el contenido de los dos archivos coincida
< Indica una línea desde el primer archivo
> Indica una línea desde el segundo archivo


Ahora podemos ver algunos ejemplos del uso básico de difusión. Supongamos que tenemos dos archivos, llamados lotr0.TXT y LotR1.TXT. El contenido del primer archivo es el siguiente:

Tres anillos para los reyes de élficos debajo del cielo, siete para los dwarf-lords en sus salones de piedra, nueve para hombres mortales condenados a morir, uno para el Señor Oscuro en su oscuro trono en la tierra de Mordor donde se encuentran las sombras. Un anillo para gobernarlos a todos, un anillo para encontrarlos, un anillo para traerlos a todos, y en la oscuridad los ata, en la tierra de Mordor donde las sombras se encuentran # End 

Seguramente reconociste el poema de "anillo" del libro "Señor de los anillos". Ahora suponga el segundo archivo, LotR1.TXT, Contiene las siguientes líneas en su lugar:

# El poema del anillo en el discurso negro de Mordor tres anillos para los reyes de élficos debajo del cielo, siete para las señuelas enanas en sus pasillos de piedra, nueve para hombres mortales condenados a morir, uno para el Señor Oscuro en su oscuro trono En la tierra de Mordor donde se encuentran las sombras. Cenizas nazg durbatulûk, ceniza nazg gimbatul, nazg nazg thrakatulûk, agh burzum-ishi krimpatul, en la tierra de mordor donde se encuentran las sombras 

El contenido de los dos archivos es bastante similar, pero no idéntico. Vamos a ejecutar el diferencia utilidad sobre ellos y ver qué salida produce:

$ diff lotr0.txt lotr1.txt 0a1> # El poema del anillo en el discurso negro de Mordor 6,7c7,8 < One Ring to rule them all, One Ring to find them,  Ash nazg durbatulûk, ash nazg gimbatul, > Ash Nazg Thrakatulûk, Agh Burzum-Ishi Krimpatul, 9d9 < # end 

En la primera línea de la salida, podemos leer 0A1; Qué quiere decir esto? En este caso, se nos notifica que el primer archivo coincida con el contenido del segundo, al principio (línea 0), se debe "agregar" una nueva línea (a), que corresponde a la primera línea (1) del segundo archivo. ¿Qué es esta línea?? El reportado después del > Símbolo en la segunda línea de la salida:

> # El poema del anillo en el discurso negro de Mordor 

Esto tiene sentido: la línea no existe en el primer archivo, por lo que debe agregarse para que el contenido de los dos archivos coincida.

Continuemos. Podemos ver la siguiente notación 6,7c7,8: Esto significa que las líneas 6 a 7 En el primer archivo (6,7) debe cambiarse para que coincidan las líneas 7 a 8 (7,8) int el segundo archivo. ¿Cómo deberían cambiarlos?? Las líneas del primer archivo, que podemos distinguir porque precedido por el < símbolo, son:

< One Ring to rule them all, One Ring to find them, < One Ring to bring them all, and in the darkness bind them, 

Deben cambiarse a las siguientes líneas del segundo archivo, que se pueden ver porque están precedidos por el > Símbolo en la salida DIFF:

> Ash Nazg Durbatulûk, Ash Nazg Gimbatul,> Ash Nazg Thrakatulûk, Agh Burzum-Ishi Krimpatul, 

Las líneas del primer archivo, y las líneas del segundo, en la salida, están separadas por tres guiones: (---).

Finalmente, tenemos el 9D9 Notación: esto significa que para que el contenido de los dos archivos coincida, línea 9 En el primer archivo (# final) debe eliminarse para que coincida con la línea 9 del segundo archivo.

Mostrando la salida de lado a lado

En los ejemplos anteriores, podemos ver que la salida producida por la utilidad de diff se organiza "verticalmente". Si lo preferimos, podemos hacer para que esté formateado y mostrado con dos columnas. Todo lo que tenemos que hacer es usar el -Y Opción (corta
para --lado a lado)

$ diff -y lotr0.txt lotr1.txt> # El poema del anillo en el discurso negro de Mordor tres anillos para los reyes de élficos debajo del cielo, tres anillos para los reyes de élvenes debajo del cielo, siete para los enanos en sus salones de piedra, siete para el enano -Lords en sus pasillos de piedra, nueve para hombres mortales condenados a morir, nueve para que los hombres mortales se condenaron a morir, uno para el Señor Oscuro en su oscuro trono para el Señor Oscuro en su oscuro trono en la tierra de Mordor donde las sombras mentir. En la tierra de Mordor donde se encuentran las sombras. Un anillo para gobernarlos a todos, un anillo para encontrarlos, | Ash Nazg Durbatulûk, Ash Nazg Gimbatul, un anillo para traerlos a todos, y en la oscuridad los ata, | Ash Nazg Thrakatulûk, Agh Burzum-Ishi Krimpatul, en la tierra de Mordor donde las sombras se encuentran en la tierra de Mordor donde las sombras se encuentran # Fin < 

El contenido del primer archivo se muestra en la columna izquierda, y el del segundo, en el derecho. Podemos detectar fácilmente las diferencias entre ellos: qué líneas existen solo en uno de los dos y qué líneas son diferentes. El -Y La opción solo se puede usar cuando se trabaja con DIFF en el modo "normal", que es el valor predeterminado. Existe otros modos: hablamos de ellos en la siguiente sección.

Modo normal, contexto y unificado

Por defecto, la utilidad DIFF funciona en normal modo, y produce una salida similar a la que vimos en los ejemplos anteriores. Sin embargo, hay otros dos modos que podemos usar: el contexto y unificado modo. Vamos a ver
a ellos.

El modo de contexto

El modo de contexto se puede usar invocando el programa con el -C opción (abreviatura de --contexto). En nuestro caso, produciría la siguiente salida:

$ diff -c lotr0.txt lotr1.txt *** lotr0.txt 2021-03-13 16:10:25.248286081 +0100 --- lotr1.txt 2021-03-13 15:30:54.060911632 +0100 ***************** *** 1,9 **** Tres anillos para los reyes de élficos debajo del cielo, siete para los adornos enanos en sus salones de piedra , Nueve para los hombres mortales condenados a morir, uno para el Señor Oscuro en su trono oscuro en la tierra de Mordor donde se encuentran las sombras. ! Un anillo para gobernarlos a todos, un anillo para encontrarlos, ! Un anillo para traerlos a todos, y en la oscuridad los ata, en la tierra de Mordor donde se encuentran las sombras- # End --- 1,9 ---- + # El poema del anillo en el discurso negro de Mordor tres anillos para los reyes de élficos debajo del cielo, siete para los dwarf-lords en sus salones de piedra, nueve para hombres mortales condenados a morir, uno para el Señor Oscuro en su oscuro trono en la tierra de Mordor donde se encuentran las sombras. ! Ceniza nazg durbatulûk, ceniza nazg gimbatul, ! Ash Nazg Thrakatulûk, Agh Burzum-Ishi Krimpatul, en la tierra de Mordor donde se encuentran las sombras 


Echemos un vistazo a este resultado. En primer lugar, podemos ver que los dos archivos se hacen referencia utilizando diferentes símbolos: *** para el primero y --- para el segundo.

Las dos primeras líneas proporcionan información sobre los dos archivos. Podemos ver:

  • El nombre del archivo
  • El tiempo de modificación del archivo con zona horaria (+0100 en este caso)

Las dos primeras líneas se separan del resto de la salida por 15 asterisco (*****************).

Lo que vemos inmediatamente después del separador es la notación que especifica cuál es el rango de líneas del primer archivo reportado en la salida, en este caso las líneas 1 a 9 (1,9). Después de esta notación, se informan las líneas en sí mismas. Lo mismo sucede para el segundo archivo. Podemos ver que ciertas líneas están precedidas por algunos símbolos; Veamos cuál es su significado:

Símbolo Significado
! Las líneas prefijadas por este símbolo en el primer archivo deben cambiarse a las líneas precedidas por él en el segundo archivo, para que el contenido de los dos archivos coincida
- Las líneas precedidas por este símbolo en el primer archivo, deben eliminarse para que el contenido de los dos archivos coincida
+ Las líneas en el segundo archivo precedido por este símbolo deben agregarse al primer archivo para el contenido de los dos archivos para que coincidan

El modo unificado

Usar el diferencia utilidad en modo "unificado", debemos invocarla utilizando el -u opción, que es la forma corta de --unificado. Así se vería la salida de DIFF en modo unificado en este caso:

$ diff -U lotr0.txt lotr1.txt --- lotr0.txt 2021-03-13 16:10:25.248286081 +0100 +++ LotR1.txt 2021-03-13 15:30:54.060911632 +0100 @@ -1,9 +1,9 @@ +# El poema del anillo en el discurso negro de Mordor tres anillos para los reyes de élficos debajo del cielo, siete para los cordones enanos en sus salones de piedra, nueve Porque los hombres mortales condenados a morir, uno para el Señor Oscuro en su oscuro trono en la tierra de Mordor donde se encuentran las sombras. -Un anillo para gobernarlos a todos, un anillo para encontrarlos, un anillo para traerlos a todos, y en la oscuridad los ata, +ceniza nazg durbatulûk, ceniza nazg gimbatul, +ash nazg thrakatulûk, agh burzum -ishi krimpatul, en el Tierra de mordor donde se encuentran las sombras -# fin 

Las dos primeras líneas producidas cuando se invoca diff con el -u opción, son los mismos del modo "contexto" y muestra información sobre los dos archivos. La única gran diferencia aquí es que la salida no está separada dependiendo del archivo al que pertenece: todas las líneas están "unificadas".

Crear un archivo DIFF y aplicarlo como un parche

Supongamos que queremos aplicar los cambios necesarios al contenido del primer archivo que utilizamos en los ejemplos anteriores, lotr0.TXT, para que se actualice para que coincida con el contenido del segundo archivo, LotR1.TXT; ¿Cómo procederíamos?? Para lograr nuestro objetivo podemos usar el parche utilidad y aplicar un archivo diff al original. A archivo diff Contiene la salida de DIFF, por lo que para crear uno, todo lo que tenemos que hacer es redirigir la salida de la utilidad:

$ diff -U lotr0.txt lotr1.txt> lotr.parche 


Una vez que tenemos nuestro archivo DIFF, podemos aplicar los cambios necesarios al archivo original utilizando la utilidad del parche:

$ parche -b lotr0.txt lotr.parche 

Invocamos parche utilizando el -b Opción: Esto no es obligatorio, pero es útil ya que lo hace para que se cree una copia de seguridad del archivo original antes de aplicar el parche (en este caso se nombrará lotr0.TXT.oriente). Los argumentos que
proporcionados son:

  • El nombre del archivo original en el que se debe aplicar el parche
  • El nombre del archivo que contiene el parche.

Después de aplicar el parche, el lotr0.TXT el archivo debe ser idéntico a LotR1.TXT. Podemos verificarlo usando DIFF nuevamente, que esta vez no debería producir salida:

$ diff lotr0.txt lotr1.TXT 

Conclusiones

En este tutorial aprendemos cómo usar Diff para calcular las diferencias entre dos archivos. Vimos cuáles son los modos en los que se puede usar la diferencia y cuál es el significado de los símbolos utilizados en la salida de diff. Finalmente vimos cómo crear un archivo DIFF y cómo aplicarlo como un parche utilizando la utilidad del parche.

Tutoriales de Linux relacionados:

  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Mastering Bash Script Loops
  • Cosas para instalar en Ubuntu 20.04
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?
  • Tutorial de depuración de GDB para principiantes
  • Cómo reconstruir un paquete utilizando el sistema de compilación Arch Linux
  • Bucles anidados en guiones Bash
  • Cómo montar la imagen ISO en Linux
  • Sistema colgado de Linux? Cómo escapar a la línea de comando y ..
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux