Como criar um arquivo tar dividido em vários arquivos ou estendendo-os?


26

De acordo com esta página , é possível deixar o tar criar 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 para o próximo arquivo, após o preenchimento do primeiro arquivo.

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


Respostas:


19

Dê uma olhada na --new-volume-scriptopção, que permite substituir o mecanismo de solicitação por um mecanismo diferente ou por um nome de arquivo gerado. ( (tar.info)Multi-Volume Archivesna tarpágina de informações.) O problema splité que você precisa catjuntar as peças novamente para fazer qualquer coisa, enquanto um arquivo de múltiplos volumes deve ser um pouco mais flexível.


Isso é verdade, é claro.
Eduardo I.

2
Obrigado, é isso que eu estava procurando! Agora eu descobri que há realmente algumas instruções (incl exemplo.) Disponível aqui: gnu.org/software/tar/manual/tar.html#Using-Multiple-Tapes
Samuel Lampa

O problema disso é que ele é um absurdo demais envolvido e promove o oposto de aplicativos apropriados no estilo Unix.
Jan Kyu Peblik 17/03

33

Você pode usar a divisão para isso:

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

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

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

cat tardisk* | tar xzpvf -

11
Correção pequena, -dé para sufixo numérico, não para prefixo.
yclian

8

Claro que a melhor opção para usar é a --new-volume-scriptopção.

Mas, se você souber o tamanho do arquivo (neste caso, largefile.tgz), poderá 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 -L, especifique quantos forem necessários para que a soma total dos arquivos tar seja maior que largefile.tgz)

Se você está tentando taruma estrutura de árvore de diretórios


1

Eu consegui trabalhar 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, na verdade, será o último arquivo e os outros serão deslocados por um. Ou seja, part_2.taré realmente a primeira parte, e part_k.taré a parte (n - 1)th . Corrigir isso com algum script de shell é trivial e deixado como um exercício para o leitor.


1

ele criará automaticamente arquivos com tamanho de 1,1 GB; se o seu tar for maior, você poderá aumentar o número, por exemplo, 1000 {2..1000} ou aumentar a entrada para o argumento de comprimento de fita.

tar --tape-length=1048576 -cMv --file=tar_archive.{tar,tar-{2..100}} backup.tar.lzma
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.