Revista Informática

Diff vs cmp; cual es mejor?

Publicado el 01 mayo 2016 por Drassill
Hoy quiero veniros con un articulo orientado a la comparación entre dos herramientas para comparar, valga la redundancia, dos ficheros; dichas herramientas son muy conocidas, pero generalmente el uso de una u otra suele estar relacionada más con los gustos y costumbres que con la utilidad en sí; estas herramientas se llaman diff y cmp; herramientas que están instaladas por defecto en todas las distribuciones de Linux.
diff_vs_cmp
Para saber por qué alternativa optar, lo mejor es analizar de forma independiente cada herramienta; es decir, ver cómo funciona cada una y cual ofrece más ventajas y/o facilidades que la otra. Es por ello que comenzaremos viendo uno de ellos: diff.
Probablemente sea el comando más usado de los dos en la actualidad (siendo aún así usado el comando cmp); este comando indica las modificaciones que habría que hacer con exactitud en cada uno de los ficheros para que el contenido de ambos sea idéntico. El comando en cuestión tiene la siguiente sintaxis:
diff [-b] [-e] fichero1 fichero2
Los parámetro -b y -e son opcionales; el primero ignoraría los espacios en blanco, ya que puede que esté el mismo contenido en ambos pero que el espaciado sea diferente, o que haya un salto de línea más en un fichero que en otro; haciendo que el contenido no se considere como el mismo. El parámetro -e en cambio crearía una serie de instrucciones que podemos usar para realizar los cambios y/o sustituciones pertinentes; no es una parámetro especialmente usado, pero es útil conocer su existencia. Sin importar si optamos por la inclusión de dichas instrucciones o no, tenemos que tener en cuenta que todo cambio será representado con la siguiente estructura:
líneatipo_cambio(lineas a cambiar)Para entender apropiadamente esto, lo mejor es entender el tipo de cambio que se puede requerir. En diff se mostrarían tres tipos de cambios:
  • Append: Esto significa que se tiene que añadir una línea o más para que los dos ficheros tengan que ser iguales; esto se representa con la letra a. Ejemplo: 11a2; Esto significa que a partir de la línea 11 habrían que añadir dos líneas; líneas que generalmente te pondrán debajo cuales son. Generalmente te pondrá el símbolo > o < seguido del contenido de dichas líneas. En caso de poner el símbolo < se haría referencia al fichero1, mientras que con el símbolo > haríamos referencia al fichero2.
  • Delete: Al contrario que la anterior opción, aquí estaríamos suprimiendo líneas con el fin de que ambos ficheros tengan el mismo contenido. Aquí la representación de este tipo de cambio se haría con el carácter d. Ejemplo 11d2. Aquí se estaría diciendo que las dos líneas siguiente a la 11 tienen que ser eliminadas.
  • Change: Aquí estaríamos diciendo qué líneas cambiar; el carácter usado para hacer referencia al cambio sería c, y aquí la sintaxis tiene un significado ligeramente distinto al otro. Ejemplo 11c11; Aquí diríamos simplemente que habría que cambiar el contenido de la línea 11 para que sea igual a la línea 11 del otro fichero. Es decir aquí no se estaría haciendo referencia a las siguientes o anteriores líneas del fichero, sino que se estaría haciendo referencia a la línea del fichero original. Generalmente tiene prioridad el tipo de cambio change sobre el resto
Fichero test1:
  1. Producto        objeto  precio  cantidades
  2. raton           optico  30      15
  3. pantalla        15      120     20
  4. pantalla        17      300     20
  5. teclado         105     450     20
  6. teclado         115     50      20
  7. disco           30      100     15
  8. disco           50      200     30

Fichero test2
  1. Producto        objeto  precio  cantidades
  2. raton           rueda   30      15
  3. pantalla        15      120     20
  4. pantalla        17      300     20
  5. teclado         105     450     20
  6. teclado         115     50      20
  7. disco           duro    100     15
  8. disco           50      200     30
  9. tarjeta         graf    300     10

El resultado de la comparación de estos dos ficheros con diff sería:
  1. root@debian:/tmp# diff test1 test2
  2. 2c2
  3. < raton         optico  30      15
  4. ---
  5. > raton         rueda   30      15
  6. 7c7
  7. < disco         30      100     15
  8. ---
  9. > disco         duro    100     15
  10. 8a9
  11. > tarjeta               graf    300     10

Como podemos ver diff es bastante flexible e intuitivo, ya que nos dice de una forma fácil y legible qué cambios tenemos que realizar ¿Pero qué ocurre con cmp?
Cmp es un comparador mucho más "duro" que diff, pues realiza una comparación completa carácter por carácter. Esto tiene como lado bueno que es extremadamente meticuloso con la comparación, si bien tanta meticulosidad hace que la comparación no sea tan legible como a uno le gustaría. Cmp tiene esta sintaxis:
cmp [-l]  fichero1 fichero2
El comando "simple" sin parámetro nos diría exactamente cual es el primer carácter en el que encuentra una diferencia con respecto al fichero1.
El parámetro -l es recomendable usarlo, pues te detalla la comparación por completo y te dice exactamente que carácter hay que cambiar; es más te muestra que carácter cambiar de tres formas: Por número de carácter, por valor octal en ASCII del fichero1 y por valor octal en ASCII del fichero2. El problema de este tipo de cambio es que, si bien es extremadamente detallado, tal nivel de detalle puede llegara ser un problema realizar una comparación eficiente. 
He aquí la comparación de los dos ficheros, tanto de forma "normal" como de forma detallada; es importante detallar que el resultado del comando detallado no es mostrado por completo con el fin de no hacer el post kilométrico:
  1. root@debian:/tmp# cmp test1 test2
  2. test1 test2 son distintos: byte 42, línea 2
  3. root@debian:/tmp# cmp -l test1 test2
  4.  42 157 162
  5.  43 160 165
  6.  44 164 145
  7.  45 151 144
  8.  46 143 141
  9.  47 157  11
  10.  48  11  63
  11.  49  63  60
  12.  50  60  11
  13.  51  11  61
  14.  52  61  65
  15.  53  65  12

Como podéis ver, el comando cmd ofrece un resutlado detallado al extremo, pero para el uso normal del día a día, nos es más práctico y útil el uso del comando diff. Eso no significa que cmd tenga menos valor, pero a menos que queramos realizar comparaciones extremadamente técnicas, diff nos puede dar un resultado mucho más claro que nos ayudará a determinar con facilidad el origen de la desigualdad de ambos ficheros.
Espero que os haya resultado útil.
Saludos.

Volver a la Portada de Logo Paperblog