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

83

Preciso fazer backup de um diretório bastante grande, mas estou limitado pelo tamanho de arquivos individuais. Gostaria essencialmente de criar um tar.(gz|bz2)arquivo dividido em 200 MB de arquivos no máximo. O Clonezilla faz algo parecido com isso dividindo os backups de imagem com o seguinte nome:

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 splitcomando, mas gostaria de não precisar criar um arquivo gigante e depois dividi-lo em arquivos menores, pois isso dobraria o espaço em disco necessário para criar o arquivo inicialmente.

Naftuli Kay
fonte
Uma questão relacionada: superuser.com/q/290986/11574
sampablokuper

Respostas:

108

Você pode canalizar o 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 o seguinte (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.
jordanm
fonte
3
Ótimo! Como posso então extrair o arquivo?
Naftuli Kay
24
Vai cat sda1.backup.tar.gz.* | tar xzvf -fazer o trabalho?
Naftuli Kay
3
Sim deveria. splitpor padrão, define os nomes dos arquivos para que, quando classificados por LOCALE (que é feito por meio de shell globbing), estejam na ordem correta.
Jordanm
4
Sem verboso, basta fazer tar czf ...sem o ve mesclar por cat backup.tar.gz.* | tar tar xzf - sem v. Não vejo nenhum benefício da saída detalhada aqui por v.
Léo Léopold Hertz
11
Apenas ajudou um amigo por embalagem Xcode em um FAT32 formatado unidade flash com: tar cvzf - Xcode.app/ | split -b 2000m - /Volumes/PH/xcode/xcode.tgz(usado a partir de cd /Applications/) Muito obrigado :)
ecth
13

No macOS, o splitcomando funciona de maneira um pouco diferente:

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

Apenas para adicionar: como o tamanho máximo permitido do arquivo em vfat / fat32 é 2 ^ 32 menos 1 (4294967295 bytes), o comando split com o tamanho máximo permitido do arquivo nesse sistema de arquivos é:

split -b4294967295 -d my_input_file my_output_file_splitted
Aydin K.
fonte
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 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"
Sergey Romanovsky
fonte
Não votei na sua resposta porque estou feliz em ver uma que a use -M --tape-length. No entanto, essa resposta ignora a solicitação do OP por uma solução que use a compressão gzip ou bzip2.
sampablokuper
Cuidado: você não está falando, tarmas sobre um clone do tar chamado gtar(GNU tar). Esse clone tar suporta a criação de arquivos com vários volumes, mas com uma probabilidade perceptível não pode / não deseja extrair desses arquivos, pois afirma incorretamente que um volume de acompanhamento não é a parte de continuação correta.
schily 01/09/19