Compressão de script (ZIP ou TAR) a ser feita em pedaços

3

Estou tentando encontrar um utilitário ou uma abordagem que me permita compactar um diretório inteiro em partes. Eu sei que é fácil especificar, por exemplo, que os arquivos criados devem ser exatamente do tamanho X ou menores, mas os utilitários de arquivamento geralmente fazem com que você precise de todos os arquivos para abrir o arquivo, e é isso que eu estou tentando evitar. Eu preciso ser capaz de especificar um tamanho máximo de um arquivo e adicionar arquivos nele até que fique sem espaço no próximo arquivo para que ele inicie um novo arquivo. Dessa forma, os arquivos são tecnicamente independentes uns dos outros.

Me desculpe, é difícil colocar isso em palavras com precisão. Por favor, comente se não estou sendo específico o suficiente.

    
por Daniel Henry 09.02.2010 / 17:59

4 respostas

2

Este é um conceito que me interessa por um tempo, embora eu não tenha conseguido escrever um roteiro para ele ainda, já que estou um pouco ocupado!

Não existe uma maneira fácil para o software saber realmente o que algo irá compactar, sem executar os arquivos através do algoritmo primeiro (lembre-se, o tar é apenas um arquivador, não um utilitário de compactação) mas você pode usá-lo com gzip). A outra opção (mais fácil) seria continuar adicionando arquivos ao arquivo e, em seguida, verificar o tamanho de cada vez. Eu não sei de nenhuma solução pronta para conseguir isso, mas ela pode ser implementada em algumas linhas de código!

A lógica básica seria algo assim:

Isso depende de qual utilitário você também usa. Alguns não têm opções que permitem remover facilmente um arquivo do arquivo morto, portanto, talvez seja necessário adicionar uma segunda variável de entrada para a folga. Essa segunda variável pode determinar o tamanho máximo estimado de um arquivo no diretório e, se o arquivo for maior que esse tamanho, ele será incluído no arquivo. Se não houvesse espaço suficiente, o arquivo fecharia e criaria um novo. É claro, você pode ajustar esse algoritmo no infinito, garantindo que o tamanho do próximo arquivo seja verificado e comparado com o tamanho atual do arquivo. Você provavelmente também vai querer usar os arquivos maiores primeiro, então como você pode ver muita lógica pode entrar nisso.

Infelizmente, esta não é uma solução completa, mas espero que seja um bom ponto de partida!

    
por 09.02.2010 / 19:09
1

A única maneira que posso ver para fazer isso seria adivinhar o tamanho dos arquivos compactados. Se os arquivos são todos de tipos similares (texto, imagens, etc), então você provavelmente pode adivinhar quão bem o tamanho final do arquivo compactado será após a combinação do número x deles.

Eu não acho que qualquer coisa faça o que você está pedindo, já que isso exigiria compressão- > verifique tamanho- > comprima novamente o tipo de comportamento.

    
por 09.02.2010 / 18:49
0

Suponho que você esteja fazendo o backup de um grande diretório em uma pilha de CDs e deseja extrair um arquivo de um CD colocando 1 CD (em vez de precisar colocar 2 ou mais CDs fora do arquivo multi-CD).

Talvez a maneira mais simples de atender a sua exigência seja compactar individualmente cada arquivo em seu próprio arquivo ".zip" e depois copiar esses arquivos compactados para os CDs. (Existe uma maneira de armazenar o subdiretório de sub-sub-diretório do qual o arquivo original veio no arquivo ".zip", então quando você restaurar esse arquivo, ele será colocado de volta no local apropriado, mesmo que todo o arquivo ". zip "arquivos no disco estão em uma longa lista em um único diretório).

Depois de ter uma lista de arquivos zip, você pode começar a copiar a partir do topo da lista e, quando o CD estiver cheio, ejetar e retomar a cópia a partir daquele ponto na lista do próximo CD. Isso deixa um pouco de "espaço desperdiçado" no final de cada CD. Algumas pessoas, se chegarem a um pequeno arquivo mais abaixo na lista que se encaixa naquele espaço, voltarão e colocarão aquele pequeno arquivo naquele espaço desperdiçado. Algumas pessoas obsessivamente tentar reorganizar qual arquivo vai em qual disco, a fim de embalá-los todos os mais completos possíveis .

Essa abordagem - compactando independentemente cada arquivo - sacrifica algum espaço em disco para ganhar um pouco de conveniência.

    
por 16.03.2011 / 17:24
0

Até onde eu sei, o afio suporta arquivamento em vários volumes e permite restaurar dados de arquivos mortos arbitrários. Mas arquivos podem abranger dois volumes, então você pode acabar tendo que fazer algo como

cat archive-3.afio archive-4.afio | afio -i -k -
    
por 16.03.2011 / 18:02