En este artículo:
La sintaxis simple del comando diff es:
diff fichero1 fichero2
De esta forma diff compara las diferencias entre las lineas de estos dos ficheros, sin opciones especiales.
El comando diff mostrará las líneas que se tienen que cambiar para que los dos archivos coincidan.
El resultado es el siguiente:
Tenemos el fichero “resolv.conf“, cuyo contenido es:
# Generated by NetworkManager
search midominio
nameserver 192.168.8.1
nameserver 8.8.8.8
y el archivo “resolv.conf.bak“, cuyo contenido es:
# Generated by NetworkManager
search midominio
nameserver 192.168.8.1
nameserver 4.4.4.4
Cómo vemos, lo único que cambia es la última línea, la línea número 4.
Y al hacer diff de los dos ficheros, el resultado es:
# diff resolv.conf resolv.conf.bak
4c4
< nameserver 8.8.8.8
---
> nameserver 4.4.4.4
O sea, diff nos dice:
Añadimos un espacio en el primer archivo, quedando así:
# Generated by NetworkManager
search midominio
nameserver 192.168.8.1
nameserver 8.8.8.8
Y el segundo queda así:
# Generated by NetworkManager
search midominio
nameserver 192.168.8.1
nameserver 4.4.4.4
Y al hacer diff, el resultado es:
# diff resolv.conf resolv.conf.bak
4,5c4
<
< nameserver 8.8.8.8
---
> nameserver 4.4.4.4
<
< nameserver 8.8.8.8
> nameserver 4.4.4.4
De nuevo, tenemos estos dos ficheros:
# Generated by NetworkManager
search midominio
linea3
linea4
nameserver 192.168.8.1
linea6
nameserver 4.4.4.4
linea8
# Generated by NetworkManager
search midominio
nameserver 192.168.8.1
nameserver 4.4.4.4
Y el resultado de diff es:
diff resolv.conf resolv.conf.bak
3,4d2
< linea3
< linea4
6,8c4
< linea6
< nameserver 8.8.8.8
< linea8
---
> nameserver 4.4.4.4
diff resolv.conf resolv.conf.bak
3,4d2
< linea3
< linea4
De la línea 3 a la 4 del primer fichero (3,4), tienes que BORRAR (d),
para que en la línea 2 del segundo fichero, ambos sean IGUALES.
Y esto, perteneciente al primer fichero (por el símbolo < ) es lo que hay que BORRAR:
< linea3
< linea4
Seguimos:
6d3
< linea6
De la línea 6 a la 8 del primer fichero (6,8), tienes que CAMBIAR (c), para que en la línea 4 del segundo fichero, ambos sean IGUALES.
Y esto, correspondiente al primer fichero (por el símbolo < ), es lo que tienes que CAMBIAR
< linea6
< nameserver 8.8.8.8
< linea8
---
Y esto, correspondiente al segundo fichero (por el símbolo > ), es lo que tienes que CAMBIAR
> nameserver 4.4.4.4
El comando diff también puede hacer comparaciones recursivas dentro de directorios y subdirectorios.
Con el parámetro -rq, realiza comparación recursiva.
-r :recursivo
-q: muestra por pantalla solo cuando hay diferencias
El modo contextual del comando diff está diseñado para ver de un modo más visual las diferencias en las líneas de los ficheros comparados.
De nuevo, lo veremos mejor con un ejemplo. Tenemos estos dos ficheros:
[root@centos]# cat resolv.conf
# Generated by NetworkManager
search Midominio
nameserver 192.168.8.1
[root@centos]# cat resolv.conf.bak
# Generated by NetworkManager
search Midominio
nameserver 192.168.8.1
nameserver 8.8.8.8
Podemos ver que son iguales a excepción de la última línea del segundo fichero, que es una línea nueva que no encontramos en el primer fichero.
Y al ejecutar diff, obtenemos:
[root@centos]# diff -c resolv.conf resolv.conf.bak
*** resolv.conf 2020-02-24 02:55:15.888339020 +0100
--- resolv.conf.bak 2020-02-24 02:55:58.094236116 +0100
***************
*** 1,3 ****
--- 1,4 ----
# Generated by NetworkManager
search Midominio
nameserver 192.168.8.1
+ nameserver 8.8.8.8
Primero muestra info de los ficheros, como su nombre y la fecha de modificación.
El primer fichero tiene delante ***
el segundo fichero tiene delante ---
Luego está el separador ***************
Luego muestra tres asteriscos, seguidos de un rango de líneas (en este caso de la línea 1 a la 3), y otros cuatro asteriscos.
Luego muestra el contenido de esas líneas. Si la línea no cambia, tiene 2 espacios como prefijo.
Sin embargo, si la línea ha cambiado, tiene como prefijo un carácter indicativo y dos espacios.
Los significados de los caracteres son los siguientes:
! Indica que esta linea es parte de un grupo de una o más lineas que necesita cambiar.
+ Indica una línea en el segundo archivo que debe agregarse al primer archivo.
- indica una línea en el primer archivo que debe eliminarse.
Después de las líneas del primer archivo, hay tres guiones, luego un rango de linea, y luego cuatro guiones. Esto indica el rango de línea en el segundo archivo que se sincronizará con nuestros cambios en el primer archivo.
El modo unificado es muy parecido al contextual, pero no muestra info redundante.
Utilizando los mismos ficheros que en el ejemplo anterior (el de diff contextual), podemos ver que las diferencias están "unificadas".
El resultado del diff unificado muestra:
[root@centos]# diff -u resolv.conf resolv.conf.bak
--- resolv.conf 2020-02-24 02:55:15.888339020 +0100
+++ resolv.conf.bak 2020-02-24 02:55:58.094236116 +0100
@@ -1,3 +1,4 @@
# Generated by NetworkManager
search Midominio
nameserver 192.168.8.1
+nameserver 8.8.8.8
Y el resultado de diff significa:
De este número de líneas (de la 1 a la 3) del fichero 1 , a este número de líneas del fichero 2 (de la 1 a la 4).
Y luego muestra las líneas de los ficheros que tienen diferencias:
--normal : la opción por defecto de diff, arroja los resultados mostrándolos de forma "normal".
-i : Con este parámetro, diff NO examina las diferencias entre mayúsculas y minúsculas, o sea, diff actúa como Case insensitive (NO afectado por las diferencias entre mayúsculas y minúsculas). (por defecto, diff SÍ que examina las diferencias entre mayúsculas y minúsculas).
-u : Muestra el formato unificado.
-c : Muestra el modo contextual
-b : Ignora cambios que solo cambie la cantidad de espacios en blanco.
-w : ignora los espacios en blanco por completo.
-B : ignora las líneas en blanco al calcular las diferencias.
-y : muestra la salida en dos columnas
-r :recursivo
-q: muestra por pantalla solo cuando hay diferencias