Linux / Comando cmp: comparar dos archivos byte por byte

cmp compara dos archivos byte por byte. Básicamente, una vez que encuentra la primera diferencia, informa la posición del byte y el número de línea y termina, por lo que es adecuado para verificar rápidamente si los archivos son completamente iguales o para encontrar el primer punto de discrepancia.

En este artículo se explica la sintaxis básica de cmp, sus principales opciones, ejemplos de uso real, diferencias con comandos relacionados y precauciones al usarlo.

¿Qué es el comando cmp?

cmp compara las dos entradas desde el principio. Si son iguales, termina sin salida y devuelve 0; si difieren, normalmente informa la primera diferencia y devuelve 1; los errores devuelven 2 o más. Para diferencias legibles entre líneas resulta más útil diff. La lista de comandos de uso frecuente en Linux permite comparar estas herramientas con otras utilidades.

Sintaxis básica

cmp [OPCIONES] ARCHIVO1 [ARCHIVO2 [SKIP1 [SKIP2]]]

Las opciones y el comportamiento detallado pueden variar según la implementación y la versión. En el sistema actual, consulte la descripción de los comandos instalados como cmp --help y man cmp.

Uso básico de cmp

Comparar dos archivos

Si son iguales, no muestra nada; si son diferentes, muestra la ubicación de la primera diferencia.

cmp image-a.bin image-b.bin

Comprobar igualdad sin salida

-s oculta los mensajes y solo utiliza el estado de salida.

cmp -s copy.iso original.iso

Comparar solo los primeros bytes

Limita la cantidad máxima de bytes a comparar con -n de GNU cmp.

cmp -n 4096 file-a file-b

Leer la posición del primer byte diferente

cmp compara dos archivos byte por byte e indica la primera posición diferente. Si los archivos son idénticos, por defecto no imprime nada.

printf 'A' > first.bin
printf 'B' > second.bin
cmp first.bin second.bin

Ejemplo de salida (el texto puede variar según la implementación):

first.bin second.bin differ: byte 1, line 1

El estado de salida 1 indica que hay diferencias, mientras que 2 indica problemas como errores de lectura. Si no desea mostrar la salida en la pantalla en un script, utilice cmp -s y verifique el estado de salida.

Opciones principales

Opciones Descripción
-s, --silent Omite la salida normal y devuelve solo el estado de salida.
-l, --verbose Imprime la posición y el valor de todos los bytes diferentes.
-b, --print-bytes Muestra juntos los bytes diferentes en una forma legible.
-i SKIP Omite la cantidad especificada del inicio de cada entrada.
-i SKIP1:SKIP2 En la implementación de GNU, se puede especificar diferente cantidad de omisión para cada entrada.
-n LIMIT Compara solo hasta un máximo de LIMIT bytes.

Ejemplos de uso práctico

Verificar cambios en un script

Este ejemplo muestra un mensaje cuando cmp -s confirma la igualdad. La rama else incluye tanto diferencias como errores: no distingue los estados 1 y 2. Para distinguirlos, guarde el estado de cmp inmediatamente después de ejecutarlo y evalúelo por separado.

if cmp -s generated.conf current.conf; then
  printf '%s\n' 'Sin cambios'
else
  printf '%s\n' 'La comparación no confirmó la igualdad'
fi

Comparar solo el área del encabezado

Limita el rango de comparación cuando se conoce el tamaño fijo del encabezado del tipo de archivo.

cmp -n 512 disk-a.img disk-b.img

Saltar el desplazamiento y comparar

Si hay áreas que se deben excluir de la comparación, como los encabezados del contenedor, utilice la instrucción de omisión compatible.

cmp -i 4096 payload-a.bin payload-b.bin

Comparación de cmp y comandos relacionados

Comando Rol principal Situaciones adecuadas
cmp Primera diferencia en bytes Igualdad y primer desplazamiento
diff Diferencia de texto línea por línea Cambios legibles por humanos
sha256sum Cálculo del hash de cada archivo Comparación de integridad de archivos remotos y múltiples
comm Comparación de conjuntos de líneas ordenadas Separación de elementos comunes y únicos

Precauciones al usar

La salida -l puede ser muy grande

Con -l, cada línea indica la posición del byte en decimal y los valores diferentes en octal. La salida puede ser muy grande; para comprobar primero la igualdad, utilice el modo normal o -s.

Se distinguen los estados de salida

1 significa que los archivos son diferentes, 2 o más pueden ser errores en la comparación, por lo que se manejan por separado en los scripts.

Incluso si los bytes son iguales, no significa que se verifique el significado del archivo

Comprueba si los bytes son iguales, pero no verifica la validez de la firma, el origen ni el formato del archivo.

FAQ

¿Si no hay salida de cmp, significa que los archivos son iguales?

Si el comando terminó correctamente y el estado es 0, los bytes en el rango comparado son iguales.

¿Y si quiero ver todas las diferencias después de la primera?

Se usa cmp -l ARCHIVO1 ARCHIVO2, pero si hay muchas diferencias, la salida puede ser muy grande.

¿También se pueden comparar archivos de texto con cmp?

Es posible, pero para ver fácilmente las líneas modificadas, diff es más adecuado.

¿En qué se diferencia de la comparación de sumas de verificación?

cmp lee directamente dos archivos al mismo tiempo para compararlos, mientras que el checksum calcula un valor resumido de cada archivo, lo que facilita la comparación incluso en diferentes ubicaciones.

Documentación oficial