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.

Documentación oficial