cmp es un comando de la familia de los Sistemas OperativosUnix. Este realiza una comparación binaria, byte a byte, entre dos archivos y muestra el resultado en lasalida estándar. En caso de que se indique un solo archivo, toma laentrada estándar como fuente para realizar la comparación.[1]
La invocación del comandocmp tiene el siguiente formato:
cmp [PARÁMETROS]... ARCHIVO1 [ARCHIVO2 [SALTEAR1 [SALTEAR2]]]
Donde ARCHIVO1 es un archivo que se debe indicar obligatoriamente, y si en cambio no se indica ARCHIVO2,cmp utiliza laentrada estándar como fuente para realizar la comparación. También es posible hacer esto usando el guion (-).
Si se invoca el comando pasándole solo los dos archivos, y estos llegaran a ser distintos,cmp muestra en pantalla la posición del primer byte en donde difieren. En caso contrario no muestra nada en pantalla.
Por otro lado es posible indicarle al comando que se saltee una cantidad de bytes del comienzo de cada archivo, esto se define donde se indican SALTEAR1 y SALTEAR2 respectivamente.
Es importante aclarar, que la posición (o número) de los bytes mostrados en pantalla, se comienza a contar a partir de uno (1) y son relativas a la comparación y no del archivo original. Esto implica que si se indica saltearn bytes de un archivo, la primera posición (1) decmp corresponde a la posiciónn dentro del archivo.
La comparación binaria se realiza hasta el final de los archivos, siempre y cuando la cantidad de bytes a comparar es la misma. En caso contrario finaliza apenas encuentrala marca de fin de archivo, ycmp indica en pantalla con cual archivo ocurrió.
Los parámetros posibles a utilizar son:
-b, --print-bytes
-in, --ignore-initial=n
-in1:n2, --ignore-initial=n1:n2
-l, --verbose
-nMÁXIMO, --bytes=MÁXIMO
-s, --quiet, --silent
Los valores retornados porcmp tras su ejecución puede ser alguno de los siguientes:[2]
Teniendo en cuenta los siguientes archivos, dos de texto y otros dos binarios, se desarrollaran las comparaciones entre archivos de igual tipo:
archivo1 | archivo2 | hex1 | hex2 |
hola mundo! | solo mundo | 0x00 0x01 0x02 0x10 | 0x01 0x01 0x02 0x02 |
1. Comprobar si son idénticos:
$ cmp archivo1 archivo2 | $ cmp hex1 hex2 |
Resultado: | |
archivo1 archivo2 son distintos: byte 1, línea 1 | hex1 hex2 son distintos: byte 1, línea 1 |
2. Listar las diferencias mostrando los bytes, siendo más útil esta última opción para los archivos de texto:
$ cmp -lb archivo1 archivo2 | $ cmp -lb hex1 hex2 |
Resultado: | |
1 150 h 163 s4 141 a 157 o11 41 ! 12 ^Jcmp: fin de archivo encontrado en archivo2 | 1 0 ^@ 1 ^A4 20 ^P 2 ^B |
Nota: cada diferencia se lista en una línea (renglón) indicando: n.º de byte (posición), y por cada archivo el valor en decimal y caracter ascii del byte analizado. |
3. Listar las diferencias, salteando dos bytes del comienzo de cada archivo y procesar como máximo un solo byte:
$ cmp -n 1 -i 2 archivo1 archivo2 | $ cmp -n 1 -i 2 hex1 hex2 |
Resultado: No muestra nada, dado que los bytes a comparar son idénticos para ambos casos. Los bytes involucrados son el caracter 'l' y el valor hexadecimal 0x02. |