Comando diff: comparación de archivos, formato de parche de diff -u y opciones

Entorno de pruebaFamilia RHELAlmaLinux 9.8Cuenta root
Comandos para ver y editar textodiffUbicación/usr/bin/diff

El comando diff es un comando de Linux que compara dos archivos línea por línea y muestra solo las líneas que son distintas. Al comparar con diff un archivo anterior y uno nuevo que imitan la configuración de un servidor web, los tres lugares cambiados aparecieron en las tres líneas 2,3c2,3, 5d4 y 6a6, y en el archivo de parche guardado con la opción -u los mismos cambios quedaron ordenados con signos menos y más.

Los nombres y el contenido de los archivos de la salida de abajo y la carpeta de trabajo /root/work son valores de ejemplo. Todos los archivos comparados son archivos pequeños creados para la prueba.

1️⃣ Uso básico del comando diff y lectura de la salida

La forma básica del comando es diff, las opciones, el primer archivo y el segundo archivo, en ese orden. Muestra, con los números de línea, qué líneas hay que cambiar, borrar o añadir para que el primer archivo quede igual que el segundo.

Los dos archivos usados en la comparación son archivos de seis líneas que imitan la configuración de un servidor web.

cd /root/work
cat config-old.conf
# app config
listen 80
server_name example.com
root /var/www/html
gzip off
log_level warn
cat config-new.conf
# app config
listen 443
server_name example.com www.example.com
root /var/www/html
log_level warn
cache on

Los dos archivos se compararon sin opciones.

diff config-old.conf config-new.conf
2,3c2,3
< listen 80
< server_name example.com
---
> listen 443
> server_name example.com www.example.com
5d4
< gzip off
6a6
> cache on
echo $?
1

En la salida se alternan líneas de posición y líneas de contenido. La letra central de una línea de posición es c para cambiar, d para borrar y a para añadir; a la izquierda de la letra están los números de línea del primer archivo y a la derecha los del segundo. Si hay alguna diferencia, el código de salida es 1.

SalidaSignificado
2,3c2,3Cambia las líneas 2–3 del primer archivo por las líneas 2–3 del segundo archivo (change)
5d4Borra la línea 5 del primer archivo (delete). Al borrarla, queda alineada después de la línea 4 del segundo archivo
6a6Añade la línea 6 del segundo archivo después de la línea 6 del primer archivo (add)
< líneaLínea que está en el primer archivo
> líneaLínea que está en el segundo archivo
---Límite entre el lado del primer archivo y el del segundo archivo en las líneas que se cambian (c)

Al comparar archivos con el mismo contenido no se muestra nada y el comando termina con el código de salida 0.

diff config-old.conf config-copy.conf
echo $?
0

Si se indica un archivo que no existe, aparece un mensaje de error y el código de salida es 2.

diff config-old.conf nosuch.conf
diff: nosuch.conf: No such file or directory
echo $?
2

En un script, estos tres valores permiten distinguir entre igual, distinto y error.

2️⃣ Formato unificado de diff -u y archivos de parche

La salida predeterminada solo muestra las líneas cambiadas, así que en un archivo de configuración con cientos de líneas es difícil saber cerca de qué ajuste están. Con -u se muestra en el formato unificado (unified), que agrupa hasta tres líneas antes y después de las líneas cambiadas.

diff -u config-old.conf config-new.conf
--- config-old.conf     2026-10-29 02:24:50.840228932 +0000
+++ config-new.conf     2026-10-29 02:24:50.840228932 +0000
@@ -1,6 +1,6 @@
 # app config
-listen 80
-server_name example.com
+listen 443
+server_name example.com www.example.com
 root /var/www/html
-gzip off
 log_level warn
+cache on

Las dos líneas de cabecera (---, +++) muestran el nombre y la hora de modificación de los dos archivos, y la línea @@ -1,6 +1,6 @@ es un bloque (hunk) que agrupa 6 líneas desde la línea 1 del primer archivo y 6 líneas desde la línea 1 del segundo. En las líneas de debajo, un - al principio indica una línea borrada del primer archivo, un + una línea añadida al segundo archivo y un espacio una línea que está igual en los dos archivos.

-c es el formato de contexto (context). Muestra por separado el bloque del primer archivo y el del segundo, con un signo de exclamación delante de las líneas cambiadas, un signo menos en las borradas y un signo más en las añadidas.

diff -c config-old.conf config-new.conf
*** config-old.conf     Thu Oct 29 02:24:50 2026
--- config-new.conf     Thu Oct 29 02:24:50 2026
***************
*** 1,6 ****
  # app config
! listen 80
! server_name example.com
  root /var/www/html
- gzip off
  log_level warn
--- 1,6 ----
  # app config
! listen 443
! server_name example.com www.example.com
  root /var/www/html
  log_level warn
+ cache on

Con los mismos cambios, -c resultó más largo que -u porque las líneas que no cambian aparecen una vez en cada uno de los dos bloques.

Al guardar la salida de -u en un archivo, ese archivo es ya un archivo de parche. Aunque la salida se envíe a un archivo, el código de salida de diff sigue siendo 1.

diff -u config-old.conf config-new.conf > /root/work/config.patch
echo $?
1
cat /root/work/config.patch
--- config-old.conf     2026-10-29 02:24:50.840228932 +0000
+++ config-new.conf     2026-10-29 02:24:50.840228932 +0000
@@ -1,6 +1,6 @@
 # app config
-listen 80
-server_name example.com
+listen 443
+server_name example.com www.example.com
 root /var/www/html
-gzip off
 log_level warn
+cache on

El contenido del archivo guardado es igual al resultado de -u mostrado en pantalla. Si se pasa este archivo al comando patch, el primer archivo se puede dejar con el mismo contenido que el segundo.

3️⃣ Opciones de diff e ignorar espacios y mayúsculas

Al copiar una configuración a mano aparecen líneas con el mismo contenido que solo se distinguen por las mayúsculas o los espacios. El segundo par de archivos de ejemplo cambia la L mayúscula de la primera línea por una minúscula, convierte un espacio de la segunda línea en dos y añade una línea en blanco.

cat case-a.txt
Listen 80
ServerName example.com
DocumentRoot /var/www/html
cat case-b.txt
listen 80
ServerName  example.com

DocumentRoot /var/www/html
diff case-a.txt case-b.txt
1,2c1,3
< Listen 80
< ServerName example.com
---
> listen 80
> ServerName  example.com
>

Al comparar sin opciones, las líneas 1–2, que significan lo mismo, también salen como líneas cambiadas. Si se ignoran las mayúsculas con -i, la línea Listen desaparece y solo queda la línea 2 del primer archivo.

diff -i case-a.txt case-b.txt
2c2,3
< ServerName example.com
---
> ServerName  example.com
>

Al añadir -w se ignoran todos los espacios dentro de la línea, así que la línea ServerName también pasa a ser igual y solo queda la línea en blanco añadida en la línea 3. Al poner -b, que ignora solo la cantidad de espacios, en lugar de -w, el resultado fue el mismo con estos archivos.

diff -i -w case-a.txt case-b.txt
2a3
>

Al añadir también -B se ignoran las diferencias de líneas en blanco, de modo que terminó sin salida y con el código de salida 0.

diff -i -w -B case-a.txt case-b.txt
echo $?
0

Para ver los dos archivos uno al lado del otro, a izquierda y derecha, se usa -y. El ancho predeterminado es de 130 columnas, así que se redujo con -W 70.

diff -y -W 70 config-old.conf config-new.conf
# app config                            # app config
listen 80                         |     listen 443
server_name example.com           |     server_name example.com www.ex
root /var/www/html                      root /var/www/html
gzip off                          <
log_level warn                          log_level warn
                                  >     cache on

La barra vertical (|) del centro indica una línea cambiada, < una línea que solo está en el primer archivo y > una línea que solo está en el segundo. Al reducir el ancho, las líneas largas se cortan. La línea server_name solo se mostró hasta www.ex en la parte derecha.

Al añadir --suppress-common-lines se quitan las líneas iguales y solo quedan las distintas.

diff -y --suppress-common-lines -W 70 config-old.conf config-new.conf
listen 80                         |     listen 443
server_name example.com           |     server_name example.com www.ex
gzip off                          <
                                  >     cache on

Para comprobar solo si los archivos son iguales o distintos, y no el contenido de las diferencias, se usa -q. Cuando los archivos son iguales, -q no muestra nada, así que para obtener una línea que diga que son iguales se usa -s.

diff -q config-old.conf config-new.conf
Files config-old.conf and config-new.conf differ
diff -s config-old.conf config-copy.conf
Files config-old.conf and config-copy.conf are identical

Las opciones están reunidas en las dos pestañas de abajo.

OpciónCopiarDescripción
-u, --unifiedMuestra en el formato unificado, que agrupa hasta tres líneas antes y después de las líneas cambiadas
-c, --contextFormato de contexto, que muestra por separado el bloque del primer archivo y el del segundo
-i, --ignore-caseIgnora las diferencias de mayúsculas y minúsculas
-w, --ignore-all-spaceIgnora todos los espacios dentro de la línea
-b, --ignore-space-changeIgnora solo las diferencias en la cantidad de espacios
-B, --ignore-blank-linesIgnora las diferencias de líneas en blanco
-y, --side-by-sideMuestra los dos archivos uno al lado del otro, a izquierda y derecha
-W, --widthNUMIndica el ancho de la salida en paralelo. El valor predeterminado es de 130 columnas
--suppress-common-linesEn la salida en paralelo, quita las líneas iguales y muestra solo las distintas
-q, --briefMuestra solo si son iguales o distintos. Si son iguales, no muestra nada
-s, --report-identical-filesMuestra una línea que dice que son iguales cuando los dos archivos lo son
-r, --recursiveCompara también los archivos de las subcarpetas
OpciónCopiarDescripción
-U, --unifiedNUMIndica cuántas líneas anteriores y posteriores se muestran junto al cambio en el formato unificado. El valor predeterminado es 3
-N, --new-fileTrata como archivo vacío el archivo que falta en uno de los lados
-x, --excludePATExcluye de la comparación los archivos cuyo nombre coincide con el patrón
-I, --ignore-matching-linesREIgnora la diferencia si todas las líneas cambiadas coinciden con la expresión regular
-Z, --ignore-trailing-spaceIgnora los espacios al final de la línea
-E, --ignore-tab-expansionIgnora las diferencias producidas al convertir tabuladores en espacios
-a, --textTrata todos los archivos como texto
--strip-trailing-crQuita el retorno de carro del final de la línea antes de comparar
--colorWHENAñade color a la salida. WHEN es never, always o auto
-v, --versionMuestra la información de versión

🔲 Simulador del comando diff

En el simulador de abajo se puede escribir diff directamente con los archivos de ejemplo del artículo. Se puede guardar un archivo de parche con -u o comparar con -i -w -B y -rq, y si se añade una línea a config-new.conf y se vuelve a comparar, aparece el resultado cambiado.

Simulador del comando diffdiff · Cuenta root
[root@server work]#
Con las teclas ↑↓ recuperas los comandos que escribiste antes.

4️⃣ Comparar carpetas con diff -r

Para comparar varios archivos a la vez, como antes y después de desplegar los archivos de un sitio, se escriben nombres de carpeta en lugar de archivos. Las carpetas de ejemplo site-v1 y site-v2 tienen las dos index.html y una carpeta css, mientras que about.html y contact.html solo están en uno de los lados.

diff site-v1 site-v2
Only in site-v1: about.html
Only in site-v2: contact.html
Common subdirectories: site-v1/css and site-v2/css
diff site-v1/index.html site-v2/index.html
2,3c2,3
< <p>Version 1</p>
< <a href="about.html">About</a>
---
> <p>Version 2</p>
> <a href="contact.html">Contact</a>

Al comparar carpetas sin opciones, los archivos que solo están en un lado aparecen como líneas [Only in] y las subcarpetas solo como líneas [Common subdirectories], sin comparar los archivos que contienen. Para index.html, que está con el mismo nombre en las dos carpetas, las diferencias se muestran debajo de la línea [diff site-v1/index.html site-v2/index.html]. Con -r se muestra también el valor de color cambiado en style.css, dentro de la carpeta css.

diff -r site-v1 site-v2
Only in site-v1: about.html
Only in site-v2: contact.html
diff -r site-v1/css/style.css site-v2/css/style.css
2c2
< h1 { color: #222; }
---
> h1 { color: #0a58ca; }
diff -r site-v1/index.html site-v2/index.html
2,3c2,3
< <p>Version 1</p>
< <a href="about.html">About</a>
---
> <p>Version 2</p>
> <a href="contact.html">Contact</a>

En una carpeta con muchos archivos, primero se comprueba con -rq la lista de archivos cambiados y después se comparan de nuevo con diff solo los archivos necesarios.

diff -rq site-v1 site-v2
Only in site-v1: about.html
Only in site-v2: contact.html
Files site-v1/css/style.css and site-v2/css/style.css differ
Files site-v1/index.html and site-v2/index.html differ

🔢 FAQ & contenido recomendado

cmp compara dos archivos byte a byte y muestra solo la primera posición en la que difieren. Al comparar con cmp los dos archivos de configuración del artículo, el resultado fue la única línea [config-old.conf config-new.conf differ: char 21, line 2]. Se usa para comprobar si son iguales archivos comprimidos o imágenes, donde comparar línea por línea no tiene sentido.

Se pasan al comando patch el archivo original y el archivo de parche, en ese orden ([patch config-old.conf config.patch]). patch modifica el archivo original en el mismo sitio, así que conviene escribir el resultado en otro archivo con -o o aplicarlo antes a una copia.

La opción --color[=WHEN] añade color, y en el lugar de WHEN se pone never, always o auto. --color sin valor equivale a auto y solo añade color cuando la salida va a un terminal, así que para conservar el color al pasarla a otro comando como less se usa --color=always.

ℹ️ Aviso de afiliados
El contenido de este sitio incluye enlaces de afiliado. Cuando un visitante compra un producto o servicio a través de uno de ellos, el sitio recibe una comisión del vendedor. El importe que paga el comprador(baja durante las promociones ↓)no aumenta. Los precios, descuentos y existencias publicados corresponden al momento de redacción y pueden variar, así que confírmalos con el vendedor antes de comprar. Los productos se eligen y evalúan con criterios propios, y las comisiones no influyen en el orden ni en el contenido de las reseñas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Demuestra que eres humano: 5   +   2   =