martes, 9 de agosto de 2016

diff

Al igual que el programa comm, diff se usa para detectar diferencias entre archivos. Sin embargo, diff es una herramienta mucho más compleja, soporta muchos formatos de salida y la capacidad de procesar grandes colecciones de archivos de texto a la vez. diff a menudo se usa por los desarrolladores de software para examinar cambios entre versiones diferentes de código fuente del programa, y además tiene la capacidad de examinar recursivamente directorios de código fuente, a menudo llamados árboles fuente (source trees). Un uso común para diff es crear archivos diff o parches que se usan por programas como patch (que veremos pronto) para convertir una versión de un archivo (o archivos) a otra versión.

Si usamos diff para ver nuestros archivos de ejemplo previos:

[me@linuxbox ~]$ diff file1.txt file2.txt
1d0
< a
4a4
> e

vemos su estilo de salida por defecto: una breve descripción de las diferencias entre los dos archivos. En el formato por defecto, cada grupo de cambios va precedido por un comando de cambio en la forma de un rango operación rango para describir las posiciones y tipos de cambios requeridos para convertir el primer archivo en el segundo:

Tabla 20-4: Comandos de cambio de diff
Cambio Descripción
r1ar2 Añade las líneas en la posición r2 del segundo archivo a la posición r1 del primer archivo.
r1cr2 Cambia (reemplaza) las lineas en la posición r1 con las líneas en la posición r2 en el segundo archivo.
r1dr2 Borra las líneas en el primer archivo en la posición r1, que habrían aparecido en el rango r2 del segundo archivo.

En este formato, un rango es una lista separada por comas de la línea inicial y la línea final. Aunque este formato es el que viene por defecto (principalmente por conformidad con POSIX y retrocompatibilidad con versiones tradicionales de diff de Unix), no está tan ampliamente usado como otros formatos opcionales. Dos de los formatos más populares son el formato contextual y el formato unificado.

Cuando lo vemos usando el formato contextual (la opción -c), veremos ésto:

[me@linuxbox ~]$ diff -c file1.txt file2.txt
*** file1.txt 2008-12-23 06:40:13.000000000 -0500
--- file2.txt 2008-12-23 06:40:34.000000000 -0500
***************
*** 1,4 ****
- a
  b
  c
  d
--- 1,4 ----
  b
  c
  d
+ e

La salida comienza con los nombres de los dos archivos y sus fechas de modificación. El primer archivo está marcado con asteriscos y el segundo archivo está marcado con guiones. En el resto de la lista, estos marcadores simbolizarán sus respectivos archivos. A continuación, vemos grupos de cambios, incluyendo el número predeterminado de líneas de contexto existentes. En el primer grupo, vemos:

*** 1,4 ***

que indica líneas de la 1 a la 4 en el primer archivo. A continuación vemos:

--- 1,4 ---

que indica líneas de la 1 a la 4 en el segundo archivo. Dentro de un grupo de cambios, las líneas comienzan con uno de estos cuatro indicadores:

Tabla 20-5: Indicadores de cambios de diff en formato contextual
Indicador Significado
blank Una línea de contexto mostrada. Indica que no hay ninguna diferencia entre los dos archivos.
- Una línea borrada. Esta línea aparecerá en el primer archivo pero no en el segundo.
+ Una línea añadida. Esta línea aparecerá en el segundo archivo pero no en el primero.
! Una línea modificada. Las dos versiones de la línea se mostrarán, cada una en su respectiva sección del grupo de cambio.

El formato unificado es similar al formato contextual pero es más conciso. Se especifica con la opción -u:

[me@linuxbox ~]$ diff -u file1.txt file2.txt
--- file1.txt 2008-12-23 06:40:13.000000000 -0500
+++ file2.txt 2008-12-23 06:40:34.000000000 -0500
@@ -1,4 +1,4 @@
-a
 b
 c
 d
+e

La diferencia más destacable entre los formatos contextual y unificado es la eliminación de las líneas duplicadas de contexto, haciendo que los resultados del formato unificado sean más cortos que los del formato contextual. En nuestro ejemplo anterior, vemos las marcas de tiempo de los archivos como los del formato contextual, seguidas de la cadena @@ -1,4 +1,4 @@. Esto indica las líneas del primer archivo y las líneas del segundo archivo descritas en el grupo de cambio. Tras ésto están las líneas en sí, con las tres líneas de contexto por defecto. Cada línea comienza con uno de tres posibles caracteres:

Tabla 20-6: Indicadores de cambios de diff en formato unificado
Carácter Significado
blank Esta línea la comparten ambos archivos.
- Esta línea se eliminó del primer archivo.
+ Esta línea se añadió al primer archivo

No hay comentarios:

Publicar un comentario