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
- Producto objeto precio cantidades
- raton optico 30 15
- pantalla 15 120 20
- pantalla 17 300 20
- teclado 105 450 20
- teclado 115 50 20
- disco 30 100 15
- disco 50 200 30
Fichero test2
- Producto objeto precio cantidades
- raton rueda 30 15
- pantalla 15 120 20
- pantalla 17 300 20
- teclado 105 450 20
- teclado 115 50 20
- disco duro 100 15
- disco 50 200 30
- tarjeta graf 300 10
El resultado de la comparación de estos dos ficheros con diff sería:
- root@debian:/tmp# diff test1 test2
- 2c2
- < raton optico 30 15
- ---
- > raton rueda 30 15
- 7c7
- < disco 30 100 15
- ---
- > disco duro 100 15
- 8a9
- > 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:
- root@debian:/tmp# cmp test1 test2
- test1 test2 son distintos: byte 42, lÃnea 2
- root@debian:/tmp# cmp -l test1 test2
- 42 157 162
- 43 160 165
- 44 164 145
- 45 151 144
- 46 143 141
- 47 157 11
- 48 11 63
- 49 63 60
- 50 60 11
- 51 11 61
- 52 61 65
- 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.