Archivos hash en un archivo tar

Archivos hash en un archivo tar

Tengo dos *.tararchivos con contenidos similares. Quiero verificar qué archivos son iguales. Muchos de los archivos son grandes, por lo que comparar hashes requeriría extraer cada archivo de cada tar y calcular el hash. ¿Hay alguna manera de codificar archivos en un tar sin tener que extraerlos? ¿Existe otra forma de comparar archivos entre dos *.tararchivos?

Respuesta1

Si es GNU tar, ejecuta esto:

tar -xf file1.tar --to-command=file-stats-from-tar

donde file-stats-from-tar está en algún lugar $PATHy es:

#!/bin/bash

md5=`md5sum`;
md5=${md5%% *}

printf "%s\t%s\n" $md5 "$TAR_FILENAME"

Cambie md5sumsi es necesario.

Esto lo hace todo en una sola pasada.

Cómo funciona es que la --to-commandopción le dice a tar que envíecadaarchivo por separado al comando que especifique, con un montón de variables de entorno configuradas (solo las usamos TAR_FILENAMEaquí).

Respuesta2

Puede que haya formas más eficientes, pero pude encontrar esta en unos momentos:

tar tf test.tar | while read x ; do echo "$(tar xfO test.tar ${x} | md5sum) ${x}" ; done

El primero tar tfsimplemente enumera los archivos en el archivo, que luego se pasa al while read xbucle bash. Para cada nombre de archivo, luego encuentra el hash usando. tar xfO test.tar ${x} | md5sumObviamente, puede reemplazar md5sum con su herramienta hash preferida. El uso extraño de echo $() ${x}es simplemente mantener la salida similar a una salida hash normal con los valores a la izquierda y los nombres de archivo a la derecha. Sin eso, solo te proporciona los hashes de todos los archivos, pero no los nombres, por lo que no puedes saber cuál fue a cuál. Incluso con esto, hay una columna adicional -en la salida que normalmente no está ahí. Podría eliminarse fácilmente con un colrmcomando en proceso.

Puede que esto no sea lo más eficiente ya que tiene que revisar el archivo tar n+1 veces si hay n archivos en él, pero con suerte el contenido tar se almacena en caché después de la primera lectura.

información relacionada