diff
Muestra línea por línea qué cambia entre dos archivos o dos carpetas.
Compara dos archivos (o dos carpetas) y te dice exactamente qué líneas cambian entre ellos. Lo usas para ver qué modificaste de un archivo de configuración, para comparar dos versiones de un script antes de quedarte con una, o para confirmar que un archivo de texto sigue igual que como te lo mandaron.
diff [opciones] ARCHIVO1 ARCHIVO2Despiece
6 ejemplosVer qué cambió entre dos archivos
| N.º | Pieza | Tipo | Qué hace |
|---|---|---|---|
| 1 | diff | Comando | El comando que compara dos archivos. |
| 2 | original.txt | Argumento | El primer archivo, el de referencia. |
| 3 | copia.txt | Argumento | El segundo archivo, contra el que se compara. |
Solo imprime las líneas que cambian: las del primer archivo con < y las del segundo con >, separadas por una línea de tres guiones (---). Si los archivos son idénticos no imprime nada. Cuando sí hay diferencias termina con código 1, que no es un error.
Comparar en formato unificado
| N.º | Pieza | Tipo | Qué hace |
|---|---|---|---|
| 1 | diff | Comando | El comando que compara dos archivos. |
| 2 | -u | Opción | Formato unificado, el mismo que usan patch y git. |
| 3 | original.txt | Argumento | El primer archivo, el de referencia. |
| 4 | copia.txt | Argumento | El segundo archivo, contra el que se compara. |
Aparecen dos encabezados --- y +++ con el nombre y la fecha de cada archivo, y bloques tipo @@ -1,3 +1,3 @@ con tres líneas de contexto. Es el formato que conviene para mandar a alguien o para guardar como parche.
Comprobar si dos archivos son iguales
| N.º | Pieza | Tipo | Qué hace |
|---|---|---|---|
| 1 | diff | Comando | El comando que compara dos archivos. |
| 2 | -q | Opción | Modo breve: solo dice si difieren, sin mostrar el detalle. |
| 3 | config.txt | Argumento | El archivo de referencia. |
| 4 | config-nuevo.txt | Argumento | El archivo que quieres comparar. |
Si son distintos imprime una línea: Files config.txt and config-nuevo.txt differ, y termina con código 1. Si son iguales no imprime nada y termina con 0, por eso sirve para preguntar por igualdad dentro de un if.
Comparar dos carpetas completas
| N.º | Pieza | Tipo | Qué hace |
|---|---|---|---|
| 1 | diff | Comando | El comando que compara dos archivos o carpetas. |
| 2 | -r | Opción | Recursivo: entra a las carpetas y compara los archivos de adentro. |
| 3 | carpeta-vieja | Argumento | La primera carpeta. |
| 4 | carpeta-nueva | Argumento | La carpeta contra la que comparas. |
Compara los archivos con el mismo nombre, entrando a todas las subcarpetas, y avisa con Only in ... cuando algo solo existe en una de las dos. Sin -r diff solo compara los archivos del primer nivel y de las subcarpetas solo imprime Common subdirectories, sin revisar lo que tienen adentro.
Ver las diferencias en dos columnas
| N.º | Pieza | Tipo | Qué hace |
|---|---|---|---|
| 1 | diff | Comando | El comando que compara dos archivos. |
| 2 | -y | Opción | Muestra los dos archivos uno junto al otro. |
| 3 | original.txt | Argumento | El primer archivo, que va en la columna izquierda. |
| 4 | copia.txt | Argumento | El segundo archivo, que va en la columna derecha. |
Las líneas quedan una al lado de la otra y las que cambian se marcan con una barra |. Se lee de un vistazo; solo sirve bien en archivos cortos, porque en la terminal angosta las columnas se cortan.
Ignorar diferencias de espacios
| N.º | Pieza | Tipo | Qué hace |
|---|---|---|---|
| 1 | diff | Comando | El comando que compara dos archivos. |
| 2 | -w | Opción | Ignora todos los espacios y tabuladores al comparar. |
| 3 | notas.txt | Argumento | El primer archivo. |
| 4 | notas-revisadas.txt | Argumento | El segundo archivo. |
No reporta nada si la única diferencia son espacios, tabuladores o sangrías. Suma -i y también se ignoran las mayúsculas. Con -b en vez de -w solo se ignora la cantidad de espacios: un espacio nuevo al inicio de una línea que antes no tenía sí se reporta.
Opciones
Las que sí vas a usar| Opción | Qué hace |
|---|---|
| -u--unified | Formato unificado, con encabezados --- y +++ y bloques @@. Es el que entienden patch y git, y el que conviene para compartir o guardar. |
| -q--brief | Solo avisa si los archivos difieren. Termina con código 1 si son distintos y con 0 si son iguales. |
| -r--recursive | Entra también a las subcarpetas y compara todo lo que hay adentro. Sin esto, diff solo compara los archivos del primer nivel y de las subcarpetas solo dice Common subdirectories. |
| -y--side-by-side | Muestra los dos archivos en dos columnas, con una barra | en las líneas que cambian. |
| -i--ignore-case | No reporta los cambios que son solo de mayúsculas y minúsculas. |
| -w--ignore-all-space | Ignora todos los espacios: sangrías, tabuladores y espacios al final de la línea. |
| -b--ignore-space-change | Ignora los cambios en la cantidad de espacios (dos espacios contra uno), pero sí reporta un espacio que aparece donde antes no había ninguno. |
| -N--new-file | Trata un archivo que no existe como un archivo vacío. Sirve para comparar contra un archivo nuevo. |
Fallas comunes
| Falla | Remedio |
|---|---|
| Comparar dos carpetas sin -r. | diff -r carpeta1 carpeta2 entra a todas las subcarpetas. Sin -r diff compara solo los archivos del primer nivel; de las subcarpetas imprime Common subdirectories y no revisa su contenido, así que se te pueden pasar cambios. |
| Guardar el resultado encima del archivo que se está comparando: diff -u original.txt copia.txt > original.txt. | La redirección abre original.txt y lo deja en cero bytes antes de que diff lea nada, así que el archivo original se pierde y el reporte muestra como nuevas todas las líneas del otro. Guarda el resultado en un nombre que no sea ninguno de los dos archivos, por ejemplo > cambios.diff. |
| Tomar el código 1 como si fuera un error de diff. | diff devuelve 0 si son iguales, 1 si son distintos y 2 si hay un problema real, como un archivo que no existe. Por eso if diff -q a b; then ... fi sirve para preguntar por igualdad. |
| diff marca como distintas todas las líneas de dos archivos que se ven iguales. | Casi siempre son los finales de línea: un archivo con CRLF (de Windows) contra uno con LF da todas las líneas como distintas. Usa diff --strip-trailing-cr a.txt b.txt para comparar sin el retorno de carro. |
Preguntas frecuentes
- ¿Cuál es la diferencia entre diff y cmp?
- cmp solo te dice si dos archivos son idénticos y se detiene en la primera diferencia; además sirve para comparar archivos binarios. diff te muestra exactamente qué líneas cambian, con contexto, y puede comparar carpetas enteras con -r.
- ¿Qué significa diff -u?
- Es el formato unificado: dos encabezados --- y +++ con el nombre y la fecha de cada archivo, y bloques @@ que delimitan los cambios con tres líneas de contexto. Es el formato que usan patch y git, y el más cómodo para compartir el resultado.
- ¿Cómo veo las diferencias entre dos carpetas?
- Con diff -r carpeta1 carpeta2. Entra a las dos carpetas y sus subcarpetas, compara los archivos con el mismo nombre y reporta como Only in los que solo existen en una. Si solo quieres la lista de archivos distintos, agrega -q: diff -rq carpeta1 carpeta2.
- ¿Por qué diff devuelve 1 si todo salió bien?
- Porque el código 1 en diff significa 'los archivos difieren', no 'hubo un error'. El 0 es para archivos iguales y el 2 para problemas reales, como un archivo inexistente. En un script puedes preguntar por igualdad con if diff -q a b > /dev/null; then echo iguales; fi.
- ¿Cómo comparo un archivo nuevo contra uno que ya existe?
- Agrega -N (--new-file) para que diff trate el archivo que falta como si estuviera vacío: diff -u -N ausente.txt presente.txt. Todas las líneas del archivo que existe aparecen con +, porque para diff son contenido nuevo.