¿Cómo crear un archivo tar dividido en varias etapas para ahorrar espacio?

Jan 08 2021

Tengo una carpeta muy grande de la que estoy tratando de crear un archivo tar. El problema es que no tengo suficiente espacio libre adicional para almacenar todo el archivo, así que quiero crear, digamos, trozos de 100-200GB del archivo a la vez y transferirlos individualmente al almacenamiento en la nube. Necesito poder controlar cuándo se crean nuevos fragmentos para que mi HDD no se llene, pero todos los comandos que he encontrado para crear archivos comprimidos divididos siempre los crean todos a la vez, en el mismo directorio.

La solución más cercana que encontré fue a partir de esta pregunta, pero todas las respuestas basan los archivos en la cantidad de archivos, no en el tamaño, lo cual es importante para mi caso de uso, ya que los tamaños de mis archivos están distribuidos de manera desigual.

Respuestas

2 EduardoTrápani Jan 08 2021 at 10:09

Puede usuario tar, con estas opciones:

--new-volume-script=COMMAND
--tape-length=N

Al final de cada volumen llamará a su script, que tendrá algunas variables de entorno para saber qué volumen se acaba de procesar. Consulte la página del manual para ver la lista completa, pero al menos la variable TAR_VOLUME es bastante útil, en caso de que tenga que cambiar el nombre del archivo de salida, o realizar un seguimiento del volumen actual de alguna manera:

TAR_VOLUME Número ordinal del volumen tar que se está procesando (se establece si se lee un archivo de varios volúmenes).

Si el script retorna 0 tarcontinuará, de lo contrario se detendrá.

Por ejemplo, esto creará cada volumen, con un tamaño máximo de 20M, llamando a su script cada vez que se alcance el límite:

tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=/path/to/myscript.sh --tape-length=20M

El script puede ser simple echo "Next volume";reado incluso podrías hacer la transferencia desde él (cambiando el nombre del volumen, porque una vez que salgas /tmp/volume.tarse sobrescribirá).

En el otro lado, asegúrese de usar la marca --multi-volume. Si no lo hace, tar se detendrá con los errores (lo dejo en caso de que alguien busque el error):

tar: EOF inesperado en el archivo

tar: Error no recuperable: saliendo ahora

tar xvf /path/to/transferred.volume --multi-volume

Prepare el volumen # 2 para /path/to/transferred.volume y presione return:

tarle pedirá el nuevo volumen. Una vez que presione enter /path/to/transferred.volume, se abrirá nuevamente, y así sucesivamente.

1 JoshHarrison Jan 09 2021 at 01:30

Siguiendo con la excelente respuesta de eduardo-trápani , a continuación se muestra una versión ligeramente modificada de un script que se encuentra en la página GNU que espera la entrada del usuario para cada volumen y vuelve a intentarlo si no se encuentra un volumen:

Para completar, este es el comando utilizado para crear el archivo:

tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=./myscript.sh --tape-length=1000M

Y este es el comando que utilicé para extraer el archivo dividido:

tar xvf /tmp/volume.tar --multi-volume --new-volume-script=./myscript.sh

myscript.sh:

#!/bin/bash
# For this script it's advisable to use a shell, such as Bash,
# that supports a TAR_FD value greater than 9.

echo "Press enter to continue to next volume"

read

echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.

name=`expr $TAR_ARCHIVE : '\(.*\)-.*'` case $TAR_SUBCOMMAND in
-c)       ;;
-d|-x|-t) test -r ${name:-$TAR_ARCHIVE}-$TAR_VOLUME || echo "Failed to find volume" ;; *) exit 1 esac echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD

Editar: esto solo funciona con GNU Tar, que se puede instalar en macOS (con Homebrew) mediante:

brew install gnu-tar

Para usarlo como su tar predeterminado, deberá agregarlo a su ruta de la siguiente manera:

export PATH="$(brew --prefix)/opt/python/libexec/bin:$PATH"