¿Cómo crear un archivo tar dividido en varias etapas para ahorrar espacio?
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
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
tar
continuará, 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";read
o incluso podrías hacer la transferencia desde él (cambiando el nombre del volumen, porque una vez que salgas /tmp/volume.tar
se 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:
tar
le pedirá el nuevo volumen. Una vez que presione enter /path/to/transferred.volume
, se abrirá nuevamente, y así sucesivamente.
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"