Crie um arquivo TAR dividido em blocos de tamanho máximo

71

Eu preciso fazer backup de um diretório razoavelmente grande, mas estou limitado pelo tamanho dos arquivos individuais. Eu gostaria de essencialmente criar um arquivo tar.(gz|bz2) que é dividido em arquivos máximos de 200MB. O Clonezilla faz algo semelhante a isso, dividindo os backups de imagem assim chamados:

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

Existe uma maneira de fazer isso em um comando? Eu entendo como usar o comando split , mas eu gostaria de não ter que criar um arquivo gigante, então dividi-lo em arquivos menores, pois isso dobraria o espaço em disco que eu precisava para criar o arquivo inicialmente .

    
por Naftuli Kay 18.01.2013 / 20:11

4 respostas

96

Você pode canalizar tar para o comando split:

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

Em alguns sistemas * nix (como o OS X), você pode receber o seguinte erro:

split: illegal option -- -

Nesse caso, tente isso (observe o -b 200m ):

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

Se você estiver tentando dividir o arquivo para caber em uma unidade formatada em FAT32, use um limite de bytes de 4294967295. Por exemplo:

tar cvzf - /Applications/Install\ macOS\ Sierra.app/ | \
split -b 4294967295 - /Volumes/UNTITLED/install_macos_sierra.tgz.
    
por 18.01.2013 / 20:35
12

No OS X (também um Unix), o comando split funciona de maneira ligeiramente diferente:

$ tar cvzf - foo | split -b 2500m - foo.tgz.
    
por 19.11.2015 / 14:44
4

Apenas para adicionar: Como o tamanho de arquivo máximo permitido em vfat / fat32 é 2 ^ 32 menos 1 (4294967295 bytes), o comando de divisão com o tamanho de arquivo máximo permitido em tal sistema de arquivos é:

split -b4294967295 -d my_input_file my_output_file_splitted
    
por 29.08.2016 / 13:29
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

Você precisará de um script para a automação movendo o arquivo pseudo-tape.tar para um novo nome:

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"
    
por 18.01.2013 / 21:02

Tags