Comando diff: comparación de archivos, formato de parche de diff -u y opciones
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/workcat config-old.conf# app config
listen 80
server_name example.com
root /var/www/html
gzip off
log_level warncat config-new.conf# app config
listen 443
server_name example.com www.example.com
root /var/www/html
log_level warn
cache onLos dos archivos se compararon sin opciones.
diff config-old.conf config-new.conf2,3c2,3
< listen 80
< server_name example.com
---
> listen 443
> server_name example.com www.example.com
5d4
< gzip off
6a6
> cache onecho $?1En 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.
| Salida | Significado |
|---|---|
| 2,3c2,3 | Cambia las líneas 2–3 del primer archivo por las líneas 2–3 del segundo archivo (change) |
| 5d4 | Borra la línea 5 del primer archivo (delete). Al borrarla, queda alineada después de la línea 4 del segundo archivo |
| 6a6 | Añade la línea 6 del segundo archivo después de la línea 6 del primer archivo (add) |
| < línea | Línea que está en el primer archivo |
| > línea | Lí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.confecho $?0Si 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.confdiff: nosuch.conf: No such file or directoryecho $?2En 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 onLas 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 onCon 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.patchecho $?1cat /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 onEl 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.txtListen 80
ServerName example.com
DocumentRoot /var/www/htmlcat case-b.txtlisten 80
ServerName example.com
DocumentRoot /var/www/htmldiff case-a.txt case-b.txt1,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.txt2c2,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.txt2a3
>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.txtecho $?0Para 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 onLa 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.conflisten 80 | listen 443
server_name example.com | server_name example.com www.ex
gzip off <
> cache onPara 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.confFiles config-old.conf and config-new.conf differdiff -s config-old.conf config-copy.confFiles config-old.conf and config-copy.conf are identicalLas opciones están reunidas en las dos pestañas de abajo.
| Opción | Copiar | Descripción |
|---|---|---|
| -u, --unified | Muestra en el formato unificado, que agrupa hasta tres líneas antes y después de las líneas cambiadas | |
| -c, --context | Formato de contexto, que muestra por separado el bloque del primer archivo y el del segundo | |
| -i, --ignore-case | Ignora las diferencias de mayúsculas y minúsculas | |
| -w, --ignore-all-space | Ignora todos los espacios dentro de la línea | |
| -b, --ignore-space-change | Ignora solo las diferencias en la cantidad de espacios | |
| -B, --ignore-blank-lines | Ignora las diferencias de líneas en blanco | |
| -y, --side-by-side | Muestra los dos archivos uno al lado del otro, a izquierda y derecha | |
| -W, --widthNUM | Indica el ancho de la salida en paralelo. El valor predeterminado es de 130 columnas | |
| --suppress-common-lines | En la salida en paralelo, quita las líneas iguales y muestra solo las distintas | |
| -q, --brief | Muestra solo si son iguales o distintos. Si son iguales, no muestra nada | |
| -s, --report-identical-files | Muestra una línea que dice que son iguales cuando los dos archivos lo son | |
| -r, --recursive | Compara también los archivos de las subcarpetas |
| Opción | Copiar | Descripción |
|---|---|---|
| -U, --unifiedNUM | Indica cuántas líneas anteriores y posteriores se muestran junto al cambio en el formato unificado. El valor predeterminado es 3 | |
| -N, --new-file | Trata como archivo vacío el archivo que falta en uno de los lados | |
| -x, --excludePAT | Excluye de la comparación los archivos cuyo nombre coincide con el patrón | |
| -I, --ignore-matching-linesRE | Ignora la diferencia si todas las líneas cambiadas coinciden con la expresión regular | |
| -Z, --ignore-trailing-space | Ignora los espacios al final de la línea | |
| -E, --ignore-tab-expansion | Ignora las diferencias producidas al convertir tabuladores en espacios | |
| -a, --text | Trata todos los archivos como texto | |
| --strip-trailing-cr | Quita el retorno de carro del final de la línea antes de comparar | |
| --colorWHEN | Añade color a la salida. WHEN es never, always o auto | |
| -v, --version | Muestra 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.
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-v2Only 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-v2Only 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-v2Only 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
Linux · Texto
Comando grep de Linux
Cómo usar grep para buscar y mostrar solo las líneas que contienen la cadena deseada en un archivo de texto, como un archivo de registro.
Linux · Texto
Comando sort de Linux: ordenar archivos
Opciones y ejemplos de sort para ordenar el contenido de un archivo alfabéticamente o en orden ascendente o descendente.
Linux · Texto
Comando uniq de Linux
Cómo usar uniq para dejar solo una de las líneas repetidas y contar con -c cuántas veces se repiten.
ℹ️ 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.