-->

Comando cmp

cmp

El comando cmp es una herramienta de línea de comandos utilizada en Linux para comparar dos archivos byte a byte. Permite determinar si dos archivos son exactamente iguales y, en caso de encontrar diferencias, indica la posición en la que aparece la primera discrepancia.

Categoría Archivos y comparación
Disponible en Linux, macOS y otros sistemas Unix
Equivalente en Windows fc (File Compare) en CMD o PowerShell
Sustituye a Permite realizar comparaciones binarias sencillas desde la terminal sin necesidad de abrir los archivos manualmente.
¿Requiere permisos de administrador? No. Solo necesita permisos de lectura sobre los archivos que se desean comparar.

¿Qué significa su nombre?

CMP es una abreviatura de compare, que significa «comparar» en inglés.

El nombre describe directamente la función principal del comando: comparar dos archivos para determinar si su contenido es idéntico o si existen diferencias entre ellos.

¿Para qué sirve?

El comando cmp sirve para comparar dos archivos byte a byte. Si ambos archivos contienen exactamente la misma información, cmp no muestra ningún mensaje y finaliza indicando mediante su código de salida que los archivos son iguales.

Si encuentra una diferencia, muestra información sobre la primera posición en la que los archivos dejan de coincidir. Esto permite detectar rápidamente si dos archivos son diferentes y localizar aproximadamente dónde comienza esa diferencia.

Es especialmente útil para comprobar si dos copias de un archivo son idénticas, verificar archivos descargados o transferidos, comprobar copias de seguridad y realizar comparaciones de archivos binarios que no resulta práctico examinar directamente como texto.

Sintaxis

cmp [opciones] archivo1 archivo2

Las opciones más habituales son:

Opción Descripción
-s No muestra ningún mensaje y utiliza únicamente el código de salida para indicar si los archivos son iguales o diferentes.
-l Muestra todas las diferencias encontradas, indicando los bytes que no coinciden.
-b Muestra los valores de los bytes que son diferentes en formato hexadecimal.
--verbose Proporciona información detallada sobre las diferencias encontradas.

Comandos más utilizados

Comando Descripción
cmp archivo1 archivo2 Compara dos archivos y muestra la posición de la primera diferencia encontrada.
cmp -s archivo1 archivo2 Compara silenciosamente los archivos y no muestra información por pantalla.
cmp -l archivo1 archivo2 Muestra todas las diferencias entre los dos archivos.
cmp -b archivo1 archivo2 Muestra los valores de los bytes diferentes de forma más detallada.

Equivalencia con otros sistemas

Acción Linux Windows CMD Windows PowerShell
Comparar dos archivos cmp archivo1 archivo2 fc archivo1 archivo2 Compare-Object (Get-Content archivo1) (Get-Content archivo2)
Comparación binaria cmp archivo1 archivo2 fc /b archivo1 archivo2 Compare-Object no está orientado específicamente a comparación byte a byte

Ejemplos

Comparar dos archivos

cmp archivo1.txt archivo2.txt

Si los archivos son idénticos, el comando no muestra ningún mensaje. Si son diferentes, indicará la posición de la primera diferencia.

Comparar dos archivos diferentes

cmp archivo1.txt archivo2.txt

Ejemplo de salida

archivo1.txt archivo2.txt differ: byte 15, line 2

En este ejemplo, cmp ha encontrado que los archivos comienzan siendo iguales, pero el primer byte diferente se encuentra en la posición 15 y corresponde a la línea 2.

Comparar dos archivos de forma silenciosa

cmp -s archivo1.txt archivo2.txt

Con la opción -s, el comando no muestra ningún mensaje. Para saber si los archivos son iguales debemos consultar el código de salida del comando.

echo $?

Un resultado de 0 significa que los archivos son iguales. Un resultado diferente de 0 indica que existe alguna diferencia o que se ha producido algún error.

Mostrar todas las diferencias

cmp -l archivo1.txt archivo2.txt

Ejemplo de salida

15 141 142
27  60  61
43 155 156

Cada línea indica una diferencia encontrada entre los archivos. La primera columna indica la posición del byte y las siguientes columnas muestran los valores de los bytes correspondientes en cada archivo.

Comparar archivos binarios

cmp programa1.bin programa2.bin

cmp no necesita que los archivos sean archivos de texto. También puede comparar archivos binarios, como ejecutables, imágenes, archivos comprimidos o cualquier otro tipo de archivo.

¿Cómo interpretar la salida?

  • Sin salida: normalmente significa que los dos archivos son idénticos.
  • differ: byte X, line Y: indica que se ha encontrado una diferencia en el byte indicado y, cuando es aplicable, en la línea correspondiente.
  • Primera diferencia: por defecto, cmp informa de la primera diferencia encontrada y finaliza la comparación.
  • Opción -l: permite obtener información sobre todas las diferencias existentes.
  • Código de salida 0: indica que los archivos son iguales.
  • Código de salida diferente de 0: indica que los archivos son diferentes o que se ha producido algún error.

Una característica importante de cmp es que no modifica ninguno de los archivos. Su función es exclusivamente compararlos.

Errores habituales

  • Esperar que cmp muestre información cuando los archivos son iguales. Por defecto, si no existen diferencias, el comando no muestra ninguna salida.
  • Confundir cmp con diff. cmp está orientado a una comparación byte a byte, mientras que diff compara archivos de texto y muestra las diferencias de una forma más orientada a líneas.
  • Confundir el código de salida con la salida visible en pantalla. Un 0 mediante echo $? indica que los archivos son iguales.
  • Utilizar cmp esperando una explicación detallada de los cambios en archivos de texto. Para estudiar diferencias línea por línea suele ser más apropiado utilizar diff.
  • Intentar comparar archivos sin disponer de permisos de lectura. El usuario debe tener acceso suficiente para poder leer ambos archivos.

Conceptos relacionados

  • Comparación de archivos
  • Byte
  • Archivo binario
  • Archivo de texto
  • Código de salida
  • Copias de seguridad
  • Integridad de archivos
  • Verificación de datos

Comandos relacionados

  • diff
  • comm
  • md5sum
  • sha256sum
  • cksum
  • diff3
  • fc

Curiosidades

A diferencia de herramientas como diff, que están especialmente pensadas para comparar archivos de texto línea por línea, cmp realiza una comparación directa de los bytes. Por este motivo, puede utilizarse tanto con archivos de texto como con archivos binarios.

Una característica interesante de cmp es que puede utilizarse en scripts gracias a su código de salida. Esto permite comprobar automáticamente si dos archivos son idénticos sin necesidad de analizar el texto mostrado por el comando.

Por ejemplo, una copia de seguridad puede compararse con el archivo original utilizando cmp. Si el código de salida es 0, ambos archivos contienen exactamente los mismos datos.

También es importante recordar que dos archivos pueden tener contenidos aparentemente similares y, sin embargo, no ser idénticos a nivel binario. Una diferencia en un solo byte es suficiente para que cmp los considere diferentes.

Prácticas propuestas

  1. Crea dos archivos llamados archivo1.txt y archivo2.txt con exactamente el mismo contenido. Utiliza cmp para comprobar que son idénticos.
  2. Modifica una línea de uno de los archivos y vuelve a ejecutar cmp. Observa el mensaje que aparece.
  3. Utiliza cmp -l archivo1.txt archivo2.txt para mostrar todas las diferencias entre los dos archivos.
  4. Utiliza cmp -s archivo1.txt archivo2.txt y posteriormente ejecuta echo $?. Comprueba qué valor aparece cuando los archivos son iguales y cuál aparece cuando son diferentes.
  5. Copia un archivo utilizando cp y utiliza posteriormente cmp para comprobar que la copia es idéntica al archivo original.
  6. Compara dos archivos binarios disponibles en tu sistema utilizando cmp. Comprueba que el comando puede trabajar con archivos que no son de texto.
  7. Compara el funcionamiento de cmp y diff utilizando dos archivos de texto que contengan algunas diferencias. Analiza qué información proporciona cada herramienta.
  8. Utiliza cmp dentro de una estructura condicional de un script para comprobar automáticamente si dos archivos son iguales.
  9. Consulta la documentación mediante man cmp y busca otras opciones que no se hayan explicado en esta práctica.

Consejo: Recuerda que cmp es especialmente útil cuando solo necesitas saber si dos archivos son exactamente iguales. Si necesitas conocer y comprender las diferencias entre dos archivos de texto línea por línea, normalmente será más apropiado utilizar diff.

Preguntas de reflexión:

  1. ¿Qué significa que cmp compare dos archivos byte a byte?
  2. ¿Qué ocurre cuando ejecutamos cmp sobre dos archivos completamente idénticos?
  3. ¿Qué información proporciona cmp cuando encuentra una diferencia?
  4. ¿Para qué sirve la opción -s y por qué puede resultar útil en scripts?
  5. ¿Qué diferencia fundamental existe entre cmp y diff?
  6. ¿Qué significa que cmp devuelva un código de salida 0?
  7. ¿Por qué cmp puede utilizarse para comparar archivos binarios?
  8. ¿Cómo podría utilizarse cmp para comprobar que una copia de seguridad es idéntica al archivo original?
Haz clic aquí para ver las soluciones y explicaciones

1. ¿Qué significa que cmp compare dos archivos byte a byte?

Significa que el comando analiza los archivos comparando los datos almacenados en cada posición. Comienza por el principio y comprueba si los bytes correspondientes son iguales. Si encuentra un byte diferente, detecta una discrepancia. Este funcionamiento permite comparar tanto archivos de texto como archivos binarios.


2. ¿Qué ocurre cuando ejecutamos cmp sobre dos archivos completamente idénticos?

Si los dos archivos son exactamente iguales, cmp no muestra ningún mensaje en la terminal y finaliza con un código de salida 0. La ausencia de salida puede resultar llamativa al principio, pero es el comportamiento normal del comando cuando no encuentra diferencias.


3. ¿Qué información proporciona cmp cuando encuentra una diferencia?

Por defecto, cmp informa de la primera diferencia que encuentra, indicando la posición del byte y, cuando corresponde, la línea en la que se encuentra. Esto permite saber rápidamente que los archivos no son idénticos y localizar el comienzo de la diferencia.


4. ¿Para qué sirve la opción -s y por qué puede resultar útil en scripts?

La opción -s hace que cmp funcione de forma silenciosa, sin mostrar mensajes en pantalla. El resultado de la comparación se obtiene mediante el código de salida. Esto es muy útil en scripts porque un programa puede comprobar si el código de salida es 0 y actuar automáticamente en función de si los archivos son iguales o diferentes.


5. ¿Qué diferencia fundamental existe entre cmp y diff?

cmp compara los archivos a nivel de bytes y está diseñado principalmente para determinar si son idénticos y localizar diferencias binarias. diff, por otro lado, está especialmente orientado a archivos de texto y muestra las diferencias entre ellos de forma estructurada y línea por línea. Por tanto, cmp resulta adecuado para saber si dos archivos son exactamente iguales, mientras que diff resulta más apropiado para estudiar qué cambios existen entre dos archivos de texto.


6. ¿Qué significa que cmp devuelva un código de salida 0?

Un código de salida 0 indica que los dos archivos comparados son iguales. En Linux, los programas utilizan habitualmente códigos de salida para comunicar si una operación se ha realizado correctamente. En el caso de cmp, el código 0 significa que no se han encontrado diferencias.


7. ¿Por qué cmp puede utilizarse para comparar archivos binarios?

Porque cmp no intenta interpretar el contenido como texto. Su funcionamiento se basa en comparar los bytes que forman los archivos. Por este motivo puede trabajar con archivos de texto, imágenes, ejecutables, archivos comprimidos y otros tipos de datos binarios.


8. ¿Cómo podría utilizarse cmp para comprobar que una copia de seguridad es idéntica al archivo original?

Primero se compararía el archivo original con su copia mediante un comando como cmp archivo_original copia_archivo. Si no aparece ninguna salida y el código de salida es 0, significa que ambos archivos son idénticos byte a byte. De esta manera se puede verificar automáticamente que una copia se ha realizado correctamente.