Crear un archivo tar dividido en bloques de un tamaño máximo

83

Necesito hacer una copia de seguridad de un directorio bastante grande, pero estoy limitado por el tamaño de los archivos individuales. Básicamente, me gustaría crear un tar.(gz|bz2)archivo que se divida en archivos de 200 MB como máximo. Clonezilla hace algo similar a esto al dividir las copias de seguridad de imágenes llamadas así:

sda1.backup.tar.gz.aa
sda1.backup.tar.gz.ab
sda1.backup.tar.gz.ac

¿Hay alguna manera de hacer esto en un comando? Entiendo cómo usar el splitcomando, pero me gustaría no tener que crear un archivo gigante, luego dividirlo en archivos más pequeños, ya que esto duplicaría el espacio en disco que necesitaría para crear inicialmente el archivo.

Naftuli Kay
fuente
Una cuestión relacionada con la pregunta: superuser.com/q/290986/11574
sampablokuper

Respuestas:

108

Puede canalizar alquitrán al comando dividido:

tar cvzf - dir/ | split --bytes=200MB - sda1.backup.tar.gz.

En algunos sistemas * nix (como OS X) puede recibir el siguiente error:

split: illegal option -- -

En ese caso, intente esto (tenga en cuenta lo siguiente -b 200m):

tar cvzf - dir/ | split -b 200m - sda1.backup.tar.gz.

Si está intentando dividir el archivo para que quepa en una unidad formateada con FAT32, use un límite de bytes de 4294967295. Por ejemplo:

tar cvzf - /Applications/Install\ macOS\ Sierra.app/ | \
split -b 4294967295 - /Volumes/UNTITLED/install_macos_sierra.tgz.
jordanm
fuente
3
¡Excelente! ¿Cómo puedo extraer el archivo?
Naftuli Kay
24
Hará cat sda1.backup.tar.gz.* | tar xzvf -el trabajo?
Naftuli Kay
3
Si, deberia. splitde manera predeterminada, establece los nombres de los archivos para que, cuando se ordenen por LOCALE (que se realiza mediante shell globing), estén en el orden correcto.
jordanm
44
Sin verbosidad, simplemente tar czf ...prescindir de la vy fusionarse cat backup.tar.gz.* | tar tar xzf - sin v. No veo ningún beneficio de la producción detallada aquí por v.
Léo Léopold Hertz 준영
1
Acabo de ayudar a un amigo empacando Xcode en una unidad flash formateada FAT32 con: tar cvzf - Xcode.app/ | split -b 2000m - /Volumes/PH/xcode/xcode.tgz(usado de cd /Applications/) Muchas gracias :)
ecth
13

En macOS, el splitcomando funciona de manera ligeramente diferente:

$ tar cvzf - foo | split -b 2500m - foo.tgz.
Erik Allik
fuente
4

Solo para agregar: como el tamaño de archivo máximo permitido en vfat / fat32 es 2 ^ 32 menos 1 (4294967295 bytes), el comando de división con el tamaño de archivo máximo permitido en dicho sistema de archivos es:

split -b4294967295 -d my_input_file my_output_file_splitted
Aydin K.
fuente
3
serega@serega-sv:~$ tar -c  -M --tape-length=1024 --file /tmp/pseudo-tape.tar --new-volume-script=/tmp/new-volume.sh --volno-file=/tmp/volno /tmp/stuff-to-archive 
tar: Removing leading `/' from member names
moving /tmp/pseudo-tape.tar to /tmp/archive.1
moving /tmp/pseudo-tape.tar to /tmp/archive.2
moving /tmp/pseudo-tape.tar to /tmp/archive.3

Necesitará un script para la automatización moviendo el archivo pseudo-tape.tar a un nuevo nombre:

serega@serega-sv:~$ cat /tmp/new-volume.sh 
dir="/tmp"
base_name="pseudo-tape.tar"
next_volume_name=`echo -n "archive."; cat $dir/volno`
echo "moving $dir/$base_name to $dir/$next_volume_name"
mv "$dir/$base_name" "$dir/$next_volume_name"
Sergey Romanovsky
fuente
No he rechazado tu respuesta, porque estoy feliz de ver una que use -M --tape-length. Sin embargo, esta respuesta ignora la solicitud del OP de una solución que use compresión gzip o bzip2.
sampablokuper
Precaución: no estás hablando de tarun clon de alquitrán llamado gtar(GNU alquitrán). Este clon de alquitrán admite la creación de archivos de varios volúmenes, pero con una probabilidad notable de que no pueda / no quiera extraer de esos archivos de varios volúmenes, ya que afirma incorrectamente que un volumen de seguimiento no es la parte de continuación correcta.
schily