Como criar um arquivo TAR dividido em, ou abrangendo, vários arquivos?

20

De acordo com esta página , pode-se permitir que o tar crie um arquivo tar "dividido" em arquivos de 100 Mb:

tar -c -M --tape-length=102400 --file=disk1.tar largefile.tgz

O problema é que esse comando exigirá que você forneça interativamente um novo nome de arquivo para o próximo arquivo, após o primeiro arquivo ser preenchido.

Alguém sabe de uma maneira de pular essa etapa interativa e deixar o tar fazer a "divisão" automaticamente?

    
por Samuel Lampa 31.05.2011 / 15:48

4 respostas

19

Dê uma olhada na opção --new-volume-script , que permite substituir o mecanismo de solicitação por um mecanismo diferente ou com um nome de arquivo gerado. ( (tar.info)Multi-Volume Archives na página de informações tar .) O problema com split é que você precisa cat das partes juntas para fazer qualquer coisa, enquanto um arquivo multivolume deve ser um pouco mais flexível.

    
por 31.05.2011 / 15:58
29

Você pode usar o split para isso:

tar czpvf - /path/to/archive | split -d -b 100M - tardisk

Isso diz ao tar para enviar os dados para stdout e dividir para selecioná-los de stdin - adicionalmente usando um sufixo numérico ( -d ), um tamanho de bloco ( -b ) de 100M e usando 'disk' como base para os nomes de arquivos resultantes (tardisk00, tardisk01, etc.).

Para extrair os dados depois, você pode usar isto:

cat tardisk* | tar xzpvf -
    
por 31.05.2011 / 15:56
7

É claro que a melhor opção para usar é a opção --new-volume-script .

Mas, se você sabe o tamanho do arquivo (neste caso, largefile.tgz), então você pode fazer isso também:

tar -c -M -L 102400 --file=disk1.tar --file=disk2.tar --file=disk3.tar largefile.tgz

Resumo:

-c = Create
-M = multi-volume
-L 102400 = 100MB files (disk1.tar, disk2.tar, disk3.tar ...)

(Para o -L, especifique quantos forem necessários para que a soma total dos arquivos tar seja maior que largefile.tgz)

Se você está tentando tar uma estrutura em árvore de diretórios

    
por 03.01.2013 / 00:57
0

Consegui que funcionasse com os seguintes comandos:

mkdir -p ./split
rm -rf ./split/*
tar -cML 102400 -F 'cp "${TAR_ARCHIVE}" \
    ./split/part_${TAR_VOLUME}.tar' \
    -f split/part_1.tar large_file.tar.gz

O único problema é que part_1.tar será realmente o último arquivo, e os outros são deslocados por um. Ou seja part_2.tar é na verdade a primeira parte e part_k.tar é a parte (n - 1) th . Consertar isso com algum script de shell é trivial e deixado como um exercício para o leitor.

    
por 12.03.2017 / 20:27

Tags