Cómo comparar dos archivos con el comando diff de la línea de comandos en Linux

1 mar 2021 5 min di lettura
Cómo comparar dos archivos con el comando diff de la línea de comandos en Linux
Indice dei contenuti

Introducción

diff es una utilidad de línea de comandos que le permite comparar dos archivos línea por línea. También puede comparar el contenido del directorio.

El diff se usa más comúnmente para crear un parche que contiene las diferencias entre uno o más archivos que se pueden aplicar usando el comando patch

Cómo usar el comando diff

La sintaxis del diff es la siguiente:

diff [OPTION]... FILES

El diff puede mostrar la salida en varios formatos; normales, contextuales y unificados, que son los más habituales. La salida incluye información sobre qué líneas de los archivos deben cambiarse para que sean idénticas. Si los archivos coinciden, no se produce ninguna salida.

Para guardar la salida del comando en un archivo, use el operador de redireccionamiento:

diff file1 file2 > patch

En este artículo, usaremos los siguientes dos archivos para explicar cómo funciona el comando diff

Archivo 1:

Ubuntu
 Arch Linux
 Debian
 CentOS
 Fedora

Archivo 2:

Kubuntu
 Ubuntu
 Debian
 Arch Linux
 Centos
 Fedora

Talla normal

En su forma más simple, cuando el diff se ejecuta en dos archivos de texto sin opciones, produce una salida en el formato normal:

diff file1 file2

La salida se verá así:

0a1
 > Kubuntu
 2d2
 < Arch Linux
 4c4,5
 < CentOS
 ---
 > Arch Linux
 > Centos

El formato de salida normal consta de una o más secciones que describen las diferencias. Cada sección se ve así:

change-command
 < from-file-line...
 ---
 > to-file-line...

0a1, 2d2 y 4c4,5 son comandos de cambio. Cada comando de edición contiene lo siguiente, de izquierda a derecha:

  • El número de línea o rango de líneas en el primer archivo.
  • Un carácter especial de cambio.
  • El número de línea o rango de líneas en el segundo archivo.

El carácter de cambio puede ser uno de los siguientes:

  • a - Agregar líneas.
  • c - Cambiar las líneas.
  • d - Eliminar las líneas.

El comando de cambio va seguido de las líneas completas eliminadas con el < ) y agregadas al archivo con el > ).

Explicamos la salida:

  • 0a1: agregue la línea 1 del segundo archivo al comienzo del archivo1 (después de la línea 0 ).
  • > Kubuntu: la línea de la segunda línea que se agrega al primer archivo como se describe arriba.
  • 2d2: elimina la línea 2 del primer archivo. El símbolo 2 después de d indica que si la línea no se elimina, se mostrará en la línea 2 del segundo archivo.
  • < Arch Linux: la línea eliminada.
  • 4c4,5 - Reemplace (cambie) la línea 5 en el primer archivo con las líneas 4-5 en el segundo archivo.
  • < CentOS: la línea del primer archivo que se reemplazará.
  • --- - Separador.
  • > Arch Linux y > Centos: líneas del segundo archivo que reemplazan la línea del primer archivo.

Formato de contexto

Cuando se usa el formato de salida de contexto, el diff muestra varias líneas de contexto alrededor de las líneas que difieren entre archivos.

La -c dice permite que la diff produzca resultados en el formato de contexto:

diff -c file1 file2
*** file1 2019-11-25 21:00:26.422426523 +0100
 --- file2 2019-11-25 21:00:36.342231668 +0100
 ***************
 *** 1,6 ****
 Ubuntu
 - Arch Linux
 Debian! CentOS
 Fedora

 --- 1,7 ----
 + Kubuntu
 Ubuntu
 Debian! Arch Linux! Centos
 Fedora

La salida comienza con los nombres y las marcas de tiempo de los archivos que se comparan y una o más secciones que describen las diferencias. Cada sección tiene este aspecto:

***************
 *** from-file-line-numbers ****
 from-file-line...
 --- to-file-line-numbers ----
 to-file-line...
  • from-file-line-numbers y to-file-line-numbers: los números de línea o el rango de líneas separadas por comas en el primer y segundo archivo, respectivamente.
  • from-file-line y to-file-line - Las diferentes líneas y líneas de contexto:
  • Las líneas que comienzan con dos espacios son líneas de contexto, líneas que son iguales en ambos archivos.
  • Las líneas que comienzan con el símbolo menos ( - ) son líneas que no coinciden con nada en el segundo archivo. Faltan líneas en el segundo archivo.
  • Las líneas que comienzan con el símbolo más ( + ) son las líneas que no coinciden con nada en el primer archivo. Faltan líneas en el primer archivo.
  • Las líneas que comienzan con el signo de exclamación ( ! ) Son las líneas cambiadas entre dos archivos. Cada grupo de líneas comienza con ! en el primer archivo tiene una coincidencia en el segundo archivo.

Explicamos las partes más importantes del resultado:

  • En este ejemplo, solo tenemos una sección que describe las diferencias.
  • *** 1,6 **** y --- 1,7 ---- nos dice el rango de líneas del primer y segundo archivo que se incluyen en esta sección.
  • Ubuntu, Debian, Fedora y las últimas líneas en blanco son iguales en ambos archivos. Estas líneas comienzan con espacios dobles.
  • La línea - Arch Linux del primer archivo no coincide con nada en el segundo archivo. Aunque esta línea también existe en el segundo archivo, las ubicaciones son diferentes.
  • La + Kubuntu del segundo archivo no coincide con nada en el primer archivo.
  • ¡La línea ! CentOS desde el primer archivo y líneas ! Arch Linux y ! CentOS del segundo archivo se cambia entre archivos.

De forma predeterminada, el número de líneas de contexto se establece en tres. Para especificar otro número, use la -C ( --contexts ):

diff -C 1 file1 file2
*** file1 2019-11-25 21:00:26.422426523 +0100
 --- file2 2019-11-25 21:00:36.342231668 +0100
 ***************
 *** 1,5 ****
 Ubuntu
 - Arch Linux
 Debian! CentOS
 Fedora
 --- 1,6 ----
 + Kubuntu
 Ubuntu
 Debian! Arch Linux! Centos
 Fedora

Formato unificado

El formato de salida unificado es una versión mejorada del formato de contexto y produce una salida más pequeña.

Use la -u para decirle al diff que imprima la salida en el formato unificado:

diff -u file1 file2
--- file1 2019-11-25 21:00:26.422426523 +0100
 +++ file2 2019-11-25 21:00:36.342231668 +0100
 @@ -1,6 +1,7 @@
 +Kubuntu
 Ubuntu
 -Arch Linux
 Debian
 -CentOS
 +Arch Linux
 +Centos
 Fedora

La salida comienza con los nombres de los archivos y las marcas de tiempo y una o más secciones que describen las diferencias. Cada sección tiene la siguiente forma:

***************
 @@ from-file-line-numbers to-file-line-numbers @@
 line-from-files...
  • @@ from-file-line-numbers to-file-line-numbers @@ - El número o rango de líneas del primer y segundo archivos incluidos en esta sección.
  • line-from-files: las líneas que difieren y las líneas de contexto:
  • Las líneas que comienzan con dos espacios son líneas de contexto, líneas que son iguales en ambos archivos.
  • Las líneas que comienzan con el símbolo menos ( - ) son las líneas que se eliminan del primer archivo.
  • Las líneas que comienzan con el símbolo más ( + ) son las líneas agregadas desde el primer archivo.

Ignorar el caso

Como puede ver en los ejemplos anteriores, el diff distingue entre mayúsculas y minúsculas de forma predeterminada.

Use la -i para decirle al diff que ignore el caso:

diff -ui file1 file2
--- file1 2019-11-25 21:00:26.422426523 +0100
 +++ file2 2019-11-25 21:00:36.342231668 +0100
 @@ -1,6 +1,7 @@
 +Kubuntu
 Ubuntu
 -Arch Linux
 Debian
 +Arch Linux
 CentOS
 Fedora

Conclusión

Comparar archivos de texto en busca de diferencias es una de las tareas más comunes para los administradores de sistemas Linux.

El diff compara los archivos línea por línea. Para obtener más información, escriba el siguiente comando en la terminal:

man diff

Support us with a

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.