Tengo dos *.tar
archivos 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 *.tar
archivos?
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 $PATH
y es:
#!/bin/bash
md5=`md5sum`;
md5=${md5%% *}
printf "%s\t%s\n" $md5 "$TAR_FILENAME"
Cambie md5sum
si es necesario.
Esto lo hace todo en una sola pasada.
Cómo funciona es que la --to-command
opció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_FILENAME
aquí).
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 tf
simplemente enumera los archivos en el archivo, que luego se pasa al while read x
bucle bash. Para cada nombre de archivo, luego encuentra el hash usando. tar xfO test.tar ${x} | md5sum
Obviamente, 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 colrm
comando 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.