La respuesta de @derobert es excelente, aunque quiero compartir alguna otra información que he encontrado.
gzip -l -v
Los archivos comprimidos con gzip ya contienen un hash (aunque no es seguro, vea esta publicación SO ):
$ echo something > foo
$ gzip foo
$ gzip -v -l foo.gz
method crc date time compressed uncompressed ratio uncompressed_name
defla 18b1f736 Feb 8 22:34 34 10 -20.0% foo
Se puede combinar el CRC y el tamaño sin comprimir para obtener una huella digital rápida:
gzip -v -l foo.gz | awk '{print $2, $7}'
cmp
Para verificar si dos bytes son iguales o no, use cmp file1 file2
. Ahora, un archivo comprimido tiene algún encabezado con los datos y el pie de página (CRC más el tamaño original) adjuntos. La descripción del formato gzip muestra que el encabezado contiene la hora en que se comprimió el archivo y que el nombre del archivo es una cadena terminada en nulo que se agrega después del encabezado de 10 bytes.
Entonces, suponiendo que el nombre del archivo sea constante y gzip "$name"
se use el mismo comando ( ), se puede verificar si dos archivos son diferentes usando cmp
y omitiendo los primeros bytes, incluida la hora:
cmp -i 8 file1 file2
Nota : la suposición de que las mismas opciones de compresión es importante, de lo contrario, el comando siempre informará que el archivo es diferente. Esto sucede porque las opciones de compresión se almacenan en el encabezado y pueden afectar los datos comprimidos. cmp
solo mira los bytes sin procesar y no lo interpreta como gzip.
Si tiene nombres de archivo de la misma longitud, puede intentar calcular los bytes que se omitirán después de leer el nombre de archivo. Cuando los nombres de archivo son de diferente tamaño, puede ejecutar cmp
después de omitir bytes, como cmp <(cut -b9- file1) <(cut -b10- file2)
.
zcmp
Esta es definitivamente la mejor manera de hacerlo, primero comprime los datos y comienza a comparar los bytes con cmp
(realmente, esto es lo que se hace en el zcmp
( zdiff
) shellscript).
Una nota, no tenga miedo de la siguiente nota en la página del manual:
Cuando ambos archivos deben descomprimirse antes de la comparación, el segundo se descomprime en / tmp. En todos los demás casos, zdiff y zcmp usan solo una tubería.
Cuando tiene un Bash suficientemente nuevo, la compresión no utilizará un archivo temporal, solo una tubería. O, como zdiff
dice la fuente:
# Reject Solaris 8's buggy /bin/bash 2.03.