Curso de Linux / Comparar archivos con diff y cmp: diferencias y ejemplos
Para ver qué línea ha cambiado y cómo en dos archivos, use diff; para determinar rápidamente si son iguales byte por byte, use cmp. Ambos comandos normalmente devuelven el estado de salida 1 si los archivos son diferentes, lo cual es distinto del estado 2 que indica un error en el propio comando. En este tutorial, leeremos la salida y el estado de salida con dos archivos pequeños.
Para preparar y leer los archivos a comparar, consulte Ver contenido de archivos. El estado 1 de diff no indica un fallo común de ejecución, sino que hay diferencias, así que al vincularlo con estado de salida y ejecución condicional hay que distinguirlo.
Preparar archivos a comparar
El siguiente ejercicio se basa en Bash y GNU Diffutils. Si ~/linux-course-13-practice ya existe, asigne otro nombre. Si el primer mkdir falla, no ejecute el comando siguiente para crear archivos. > puede sobrescribir archivos existentes.
mkdir ~/linux-course-13-practice
cd ~/linux-course-13-practice
pwd
Si la ubicación es correcta, cree los dos archivos. Solo la segunda línea es diferente entre beta y BETA.
printf 'alpha\nbeta\ngamma\n' > old.txt
printf 'alpha\nBETA\ngamma\n' > new.txt
Leer cambios de líneas con diff
diff muestra las diferencias línea por línea. -u es un formato unificado que también muestra las líneas inalteradas alrededor de los cambios. Usando la opción --label de GNU diff, se puede adjuntar un encabezado constante en lugar de la hora de modificación del archivo para que los ejemplos sean más fáciles de leer.
diff -u --label old --label new old.txt new.txt
La salida de esta práctica es la siguiente.
--- old
+++ new
@@ -1,3 +1,3 @@
alpha
-beta
+BETA
gamma
--- representa el archivo anterior, +++ representa el archivo nuevo. La línea @@ indica el rango de líneas comparadas, la línea que comienza con - es el contenido anterior, y la línea que comienza con + es el contenido nuevo. Las líneas con un espacio delante son iguales en ambos archivos. Que los nombres sean similares no significa que diff determine cuál archivo es el 'original'. El orden de los argumentos del comando determina la dirección de la comparación.
Localizar el primer byte diferente con cmp
cmp compara archivos byte por byte y, por defecto, indica la posición de la primera diferencia encontrada. En este ejemplo, la primera diferencia aparece en la primera letra de la segunda línea, después de alpha y su salto de línea.
cmp old.txt new.txt
En GNU cmp con configuración regional en inglés, puede aparecer como old.txt new.txt differ: byte 7, line 2. La frase puede variar según la implementación, el nombre del archivo y la configuración del idioma, pero el significado de que la primera diferencia está en la segunda línea es el mismo. cmp no es una herramienta para listar todas las diferencias posteriores.
Si desea saber solo si son iguales o diferentes sin salida, adjunte -s y luego verifique inmediatamente el estado de salida. El siguiente comando imprime 1 porque el archivo de práctica es diferente. $? es el estado de salida del comando ejecutado justo antes, por lo que si coloca otros comandos en medio, el resultado cambiará.
cmp -s old.txt new.txt
echo $?
Diferenciar entre resultado de diferencia y error de ejecución
| Estado de salida | Significado general en diff·cmp | Próxima acción |
|---|---|---|
0 |
Sin diferencias | Verifique si el objetivo de comparación coincide con el estándar |
1 |
Diferencias encontradas | Verificar las partes que han cambiado con la salida de diff |
2 |
Problemas como fallo de acceso al archivo | Verificar la ruta, permisos y mensaje de error |
Para comprobar si los bytes son iguales, use cmp; para leer los cambios en el texto, use diff -u. Si el formato de fin de línea o la codificación son diferentes, puede parecer similar a simple vista pero puede haber diferencias. Los archivos binarios pueden no proporcionar una explicación útil mediante diff de texto, por lo que primero verifique la igualdad con cmp. Si necesita comparar árboles de directorios, puede utilizar GNU diff -r, pero dado que el rango del objetivo se amplía, primero debe verificar la ruta.
Documentación oficial
En el manual oficial de GNU Diffutils, puede verificar el formato de diff unificado, la salida de cmp y el estado de salida de los dos comandos.




