Linux / Comando diff: comparar archivos de texto y directorios
diff es un comando que compara dos archivos de texto o directorios y muestra las partes diferentes. En particular, el formato unified diff de -u proporciona el contexto antes y después del cambio, por lo que se utiliza ampliamente en parches y revisiones de código.
En este artículo se explica la sintaxis básica de diff, sus principales opciones, ejemplos de uso real, diferencias con comandos relacionados y precauciones al usarlo.
¿Qué es el comando diff?
Calcula las diferencias por líneas para transformar la primera entrada en la segunda. El estado 0 indica que no hay diferencias según las opciones aplicadas, 1 que sí las hay y 2 o más que se produjo un error. Verifique el estado y los mensajes de error antes de interpretar una salida vacía. La lista de comandos de uso frecuente en Linux permite comparar esta herramienta con otras utilidades.
Sintaxis básica
diff [OPCIONES] ARCHIVO1 ARCHIVO2
diff [OPCIONES] DIRECTORIO1 DIRECTORIO2
Las opciones y el comportamiento detallado pueden variar según la implementación y la versión. En el sistema actual, consulte la descripción de los comandos instalados como diff --help y man diff.
Uso básico de diff
Comparar dos archivos
La salida básica se muestra en forma de comandos de cambio.
diff old.conf new.conf
Comparar en formato unified
Se muestra el contexto alrededor de las líneas cambiadas, lo que facilita la lectura humana.
diff -u old.conf new.conf
Comparación recursiva de directorios
-r compara hasta las subrutas correspondientes.
diff -ru project-old project-new
Leer marcas de cambios y estado de finalización
diff -u presenta los cambios en formato unificado. Ejecute este ejemplo en un directorio de práctica nuevo, sin archivos previos llamados before.txt o after.txt, porque las redirecciones los sobrescriben. La línea old del primer archivo se sustituye por new en el segundo.
printf 'old\n' > before.txt
printf 'new\n' > after.txt
diff -u before.txt after.txt
Parte clave de la salida (se omite la hora del encabezado del archivo):
-old
+new
- son las líneas que solo existen en el primer archivo, + son las líneas que solo existen en el segundo archivo. Si los dos archivos son diferentes, el estado de finalización es 1, así que distíngalo del estado de fallo de ejecución 2.
Opciones principales
| Opciones | Descripción |
|---|---|
-u |
Mostrar el contexto y las diferencias en formato unificado. |
-r, --recursive |
Comparar directorios secundarios de manera recursiva. |
-q, --brief |
Informar solo si son diferentes, en lugar de diferencias detalladas. |
-s, --report-identical-files |
Se informan explícitamente también los archivos idénticos. |
-w, --ignore-all-space |
Ignora las diferencias de espacios dentro de las líneas; no ignora los saltos de línea. |
-b, --ignore-space-change |
Ignora espacios finales y diferencias en la cantidad de espacios dentro de cada línea. |
-i, --ignore-case |
Ignorar diferencias de mayúsculas y minúsculas. |
--color=auto |
Aplicar color a la salida de la terminal en las versiones de GNU que lo soportan. |
Ejemplos de uso práctico
Crear un archivo de parche
Guardar el diff unificado usando rutas relativas reproducibles desde el directorio base.
diff -u original.conf modified.conf > config.patch
Resumir cambios en el directorio
-qr compara los directorios recursivamente y resume los archivos diferentes y los que existen solo en uno de los dos árboles.
diff -qr release-a release-b
Revisar excluyendo diferencias de espacios en blanco
Usarse solo cuando los espacios en blanco no tienen significado. Interprete cuidadosamente los resultados en lenguajes donde la indentación tiene significado, como Python.
diff -u -b before.txt after.txt
Comparar diff y comandos relacionados
| Comando | Rol principal | Situaciones adecuadas |
|---|---|---|
diff |
Diferencia de texto línea por línea | Comparar configuración, fuente y directorios |
cmp |
Primera diferencia en bytes | Verificar igualdad y desplazamiento |
git diff |
Comparar cambios en el repositorio | Árbol de trabajo de Git y commit |
comm |
Comparación de conjuntos de dos archivos ordenados | Separación de líneas comunes y únicas |
Precauciones al usar
El estado de salida 1 significa que hay diferencias
Si se trata como un error simple en el script, se puede malinterpretar un resultado de comparación normal como un fallo.
La comparación detallada de líneas no es adecuada para archivos binarios
Para la igualdad binaria, cmp o una herramienta de suma de verificación es más clara.
Ignorar espacios en blanco puede ocultar diferencias reales
No se aplica la opción de ignorar a la ligera en archivos donde el formato o la sangría son significativos.
FAQ
¿Qué significa si no hay salida de diff?
Si el estado de salida es 0, no hay diferencias que informar con las opciones utilizadas. Opciones como -b y -w pueden ocultar diferencias reales, por lo que esto no garantiza identidad byte por byte.
¿Cuál es el formato de salida más fácil de leer?
Generalmente, el formato unificado de diff -u muestra el contexto junto con las diferencias y es fácil de leer.
¿Se puede comparar todo un directorio?
Se puede comparar recursivamente directorios secundarios con -r.
Si diff devuelve un código de salida 1, ¿es un error?
No. Normalmente es un resultado normal que indica que se encontraron diferencias, y un error real es 2 o mayor.




