Estoy tratando de ahorrar espacio mientras hago una copia de seguridad "tonta" simplemente volcando datos en un archivo de texto. Mi script de respaldo se ejecuta a diario y tiene este aspecto:
- Cree un directorio con el nombre de la fecha de la copia de seguridad.
- Volcar algunos datos en un archivo de texto
"$name"
. - Si el archivo es válido, gzip:
gzip "$name"
. De lo contrario,rm "$name"
.
Ahora quiero agregar un paso adicional para eliminar un archivo si los mismos datos también estaban disponibles el día anterior (y crear un enlace simbólico o un enlace duro).
Al principio pensé en usar md5sum "$name"
, pero esto no funciona porque también almaceno el nombre de archivo y la fecha de creación.
¿ gzip
Tiene una opción para comparar dos archivos comprimidos y decirme si son iguales o no? Si gzip
no tiene esa opción, ¿hay otra forma de lograr mi objetivo?
gzip
file-comparison
Lekensteyn
fuente
fuente
diff <(zcat file1) <(zcat file2)
, pero la sugerencia de mrethub dezdiff
parece mucho mejor.Respuestas:
Puede usar
zcmp
ozdiff
como sugiere mreithub en su comentario (o el comando de Kevin, que es similar). Estos serán relativamente ineficiente, ya que en realidad descomprimir los dos archivos y luego hacerlos pasar acmp
odiff
. Si solo quiere responder "son lo mismo", lo deseacmp
, será mucho más rápido.Su enfoque con el
md5sum
es perfectamente bueno, pero debe tomar el MD5 antes de ejecutarlogzip
. Luego guárdelo en un archivo junto con el.gz
archivo resultante . Luego puede comparar el archivo fácilmente, antes de comprimirlo. Si el nombre es el mismo,md5sum -c
lo hará por usted.Y la próxima copia de seguridad:
Entonces no ha cambiado. OTOH, si hubiera cambiado:
Si lo pasa
--quiet
, solo le dará el código de salida. 0 para emparejado, no 0 para diferido.MD5 es bastante rápido, pero no tan llamativo. MD4 (
openssl md4
es lo mejor que obtienes en la línea de comando, creo) es aproximadamente dos veces más rápido (ni él ni MD5 son seguros, pero ambos son tan resistentes a colisiones cuando nadie intenta subvertirlos). SHA-1 (sha1sum
) es más seguro, pero más lento; SHA-256 (sha256sum
) es seguro, pero aún más lento. CRC32 debería ser muchas veces más rápido, pero es más corto y, por lo tanto, tendrá más colisiones aleatorias. También es completamente inseguro.fuente
zdiff
parece un desperdicio ya que solo quiero saber si un archivo ha cambiado, no qué .zcmp
Parece interesante, lo intentaré.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 ):
Se puede combinar el CRC y el tamaño sin comprimir para obtener una huella digital rápida:
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 usandocmp
y omitiendo los primeros bytes, incluida la hora: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, comocmp <(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 elzcmp
(zdiff
) shellscript).Una nota, no tenga miedo de la siguiente nota en la página del manual:
Cuando tiene un Bash suficientemente nuevo, la compresión no utilizará un archivo temporal, solo una tubería. O, como
zdiff
dice la fuente:fuente
gzip -v -l
que informará el tiempo del archivo en lugar de MTIME si los cuatro bytes MTIME en el encabezado son cero. También tenga en cuenta que si MTIME está allí, generalmente es un poco antes del tiempo del archivo porque es cuando comenzó la compresión.Para comparar dos archivos gzip, solo el contenido, un comando, no
diff
, solo compararmd5sum
También puede "filtrar" las diferencias relevantes,
Si se trata de secuencias de comandos, recomendaría una función de filtro (no probada, solo un ejemplo),
fuente
cmp
.zcat
ygrep
se pueden combinar enzgrep
.zcat
es justogunzip -c
. Use la herramienta adecuada para el trabajo correcto, KISS es mejor que la hinchazón. En este caso, pasaría mi tiempo escribiendo algo que genere enlaces duros según sea necesario, eso es más divertido.