cmp es un comando de la familia de los Sistemas Operativos Unix. Este realiza una comparación binaria, byte a byte, entre dos archivos y muestra el resultado en la salida estándar. En caso de que se indique un solo archivo, toma la entrada estándar como fuente para realizar la comparación.[1]
Modo de uso
La invocación del comando cmp 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 la entrada 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 saltear n bytes de un archivo, la primera posición (1) de cmp corresponde a la posición n 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 encuentra la marca de fin de archivo, y cmp indica en pantalla con cual archivo ocurrió.
Los parámetros posibles a utilizar son:
-b, --print-bytes
- Imprime los bytes como texto. Útil para archivos que contengan texto.
-i n, --ignore-initial=n
- Saltea n bytes del comienzo de ambos archivos.
-i n1:n2, --ignore-initial=n1:n2
- Especifica saltear n bytes del comienzo de cada archivo respectivamente.
-l, --verbose
- Lista cada byte que difiere, indicando su posición y su valor en decimal.
-n MÁXIMO, --bytes=MÁXIMO
- Compara hasta un MÁXIMO de bytes.
-s, --quiet, --silent
- No muestra nada en pantalla. Útil para cuando se quiere aprovechar el valor de retorno
Valores retornados
Los valores retornados por cmp tras su ejecución puede ser alguno de los siguientes:[2]
- 0
- Los archivos son idénticos.
- 1
- Los archivos son diferentes.
- 2
- Error de lectura o con los parámetros.
Ejemplos
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 s 4 141 a 157 o 11 41 ! 12 ^J cmp: fin de archivo encontrado en archivo2 |
1 0 ^@ 1 ^A 4 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. |