Comandos LinuxExplicados en español
/
Ficha28 / 104
Categoría
Texto
Ejemplos
6
Ver también
grep · cat · cp · mv

diff

difference (diferencia)

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.

Sintaxisdiff [opciones] ARCHIVO1 ARCHIVO2
§ 1

Despiece

6 ejemplos
Ver qué cambió entre dos archivos

Ver qué cambió entre dos archivos

3 piezas
Lámina01 / 06
Comandodiff original.txt copia.txt
Piezas3
Escala1:1
N.ºPiezaTipoQué hace
1diffComandoEl comando que compara dos archivos.
2original.txtArgumentoEl primer archivo, el de referencia.
3copia.txtArgumentoEl segundo archivo, contra el que se compara.
Resultado

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

4 piezas
Lámina02 / 06
Comandodiff -u original.txt copia.txt
Piezas4
Escala1:1
N.ºPiezaTipoQué hace
1diffComandoEl comando que compara dos archivos.
2-uOpciónFormato unificado, el mismo que usan patch y git.
3original.txtArgumentoEl primer archivo, el de referencia.
4copia.txtArgumentoEl segundo archivo, contra el que se compara.
Resultado

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

4 piezas
Lámina03 / 06
Comandodiff -q config.txt config-nuevo.txt
Piezas4
Escala1:1
N.ºPiezaTipoQué hace
1diffComandoEl comando que compara dos archivos.
2-qOpciónModo breve: solo dice si difieren, sin mostrar el detalle.
3config.txtArgumentoEl archivo de referencia.
4config-nuevo.txtArgumentoEl archivo que quieres comparar.
Resultado

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

4 piezas
Lámina04 / 06
Comandodiff -r carpeta-vieja carpeta-nueva
Piezas4
Escala1:1
N.ºPiezaTipoQué hace
1diffComandoEl comando que compara dos archivos o carpetas.
2-rOpciónRecursivo: entra a las carpetas y compara los archivos de adentro.
3carpeta-viejaArgumentoLa primera carpeta.
4carpeta-nuevaArgumentoLa carpeta contra la que comparas.
Resultado

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

4 piezas
Lámina05 / 06
Comandodiff -y original.txt copia.txt
Piezas4
Escala1:1
N.ºPiezaTipoQué hace
1diffComandoEl comando que compara dos archivos.
2-yOpciónMuestra los dos archivos uno junto al otro.
3original.txtArgumentoEl primer archivo, que va en la columna izquierda.
4copia.txtArgumentoEl segundo archivo, que va en la columna derecha.
Resultado

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

4 piezas
Lámina06 / 06
Comandodiff -w notas.txt notas-revisadas.txt
Piezas4
Escala1:1
N.ºPiezaTipoQué hace
1diffComandoEl comando que compara dos archivos.
2-wOpciónIgnora todos los espacios y tabuladores al comparar.
3notas.txtArgumentoEl primer archivo.
4notas-revisadas.txtArgumentoEl segundo archivo.
Resultado

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.

§ 2

Opciones

Las que sí vas a usar
OpciónQué hace
-u--unifiedFormato unificado, con encabezados --- y +++ y bloques @@. Es el que entienden patch y git, y el que conviene para compartir o guardar.
-q--briefSolo avisa si los archivos difieren. Termina con código 1 si son distintos y con 0 si son iguales.
-r--recursiveEntra 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-sideMuestra los dos archivos en dos columnas, con una barra | en las líneas que cambian.
-i--ignore-caseNo reporta los cambios que son solo de mayúsculas y minúsculas.
-w--ignore-all-spaceIgnora todos los espacios: sangrías, tabuladores y espacios al final de la línea.
-b--ignore-space-changeIgnora 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-fileTrata un archivo que no existe como un archivo vacío. Sirve para comparar contra un archivo nuevo.
§ 3

Fallas comunes

FallaRemedio
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.
§ 4

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.
§ 5

Ver también