Dado que los archivos tar son un formato de transmisión, puede cat
juntar dos de ellos y obtener un resultado casi correcto, no necesita extraerlos en el disco para hacer esto. Puede descomprimir (solo) los archivos, concatenarlos juntos y volver a comprimir esa secuencia:
xzcat *.tar.xz | xz -c > combined.tar.xz
combined.tar.xz
será un tarball comprimido de todos los archivos en los tarballs componentes que solo está ligeramente dañado. Para extraer, tendrá que usar la --ignore-zeros
opción (en GNU tar
), porque los archivos tienen un marcador de "fin de archivo" que aparecerá en el medio del resultado. Aparte de eso, sin embargo, todo funcionará correctamente.
GNU tar
también admite un --concatenate
modo para producir archivos combinados. Tiene las mismas limitaciones que las anteriores, debe usar --ignore-zeros
para extraer, pero no funciona con archivos comprimidos. Puede construir algo para engañarlo para que funcione utilizando la sustitución de procesos, pero es una molestia y aún más frágil.
Si hay archivos que aparecen más de una vez en diferentes archivos tar, esto no funcionará correctamente, pero tiene ese problema independientemente. De lo contrario, esto le dará lo que desea: canalizar la salida xz
es cómo tar
comprime su salida de todos modos.
Si los archivos que solo funcionan con una tar
implementación en particular no son adecuados para sus propósitos, r
su amigo puede agregarlos al archivo :
tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
mkdir tmp
pushd tmp
tar xJf "../$x"
tar rJf ../combined.tar.xz .
popd
rm -r tmp
done
Esto solo extrae un único archivo a la vez, por lo que el espacio de trabajo está limitado al tamaño de los contenidos de un único archivo. La compresión se transmite de la misma manera que lo hubiera hecho si hubiera hecho el archivo final de una vez, por lo que será tan bueno como podría haber sido. Hace una gran cantidad de exceso de descompresión y recompresión que lo hará más lento que las cat
versiones, pero el archivo resultante funcionará en cualquier lugar sin ningún soporte especial.
Tenga en cuenta que, dependiendo de lo que desee exactamente, basta con agregar los archivos tar sin comprimir a un archivo. Comprimirán (casi) exactamente así como sus contenidos en un solo archivo, y reducirá la sobrecarga de compresión para cada archivo. Esto se vería algo así como:
tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
xz -dk "$x"
tar rJf combined.tar.xz "${x%.xz}"
rm -f "${x%.xz}"
done
Esto es un poco menos eficiente en términos del tamaño comprimido final porque hay encabezados de alquitrán adicionales en la secuencia, pero ahorra algo de tiempo en extraer y volver a agregar todos los archivos como archivos. Terminarías combined.tar.xz
conteniendo muchos db-*.tar
archivos (sin comprimir) .