Desarquivar arquivo enquanto reduz o tamanho do arquivo?

6

O dilema: eu tenho um arquivo de 10GB e um disco rígido de 20GB. Quando vou descompactar / desarquivar o arquivo, o disco rígido fica cheio e o processo falha.

Pergunta: No ubuntu server 12.04 / linux existe uma maneira de desarquivar um arquivo enquanto reduzo o tamanho do arquivo?

    
por Ethan Willis 16.10.2013 / 19:38

3 respostas

6

Aqui está outra solução. Ele não permite que você extraia arquivos individuais de um arquivo e reduza seu tamanho, mas permite que você extraia todos os arquivos reduzindo o tamanho do arquivo:

#!/bin/sh

# $1, the first paramter, is the .tar.gz file to unarchive

(
    size=$(wc -c $1)
    offset=0
    bs=4096
    while [[ $size > $offset ]]; do
        dd if=$1 bs=$bs count=1 skip=$offset status=none
        fallocate -p -o $offset -l $bs $1
        offset=$(( $offset + $bs ))
    done
) | tar xz

Salve isso em um arquivo como, por exemplo, untar_and_destroy.sh e executar como:

untar_and_destroy.sh whatever.tar.gz

O que isto faz é dar parte do arquivo .tar.gz para tar, pede ao Linux para desalocar essa parte do arquivo, e então repete para a próxima parte. Quando estiver pronto, ls -l dirá que os arquivos .tar.gz têm o mesmo tamanho de antes, mas du informará seu tamanho como 0. Isso ocorre porque o .tar.gz foi transformado em um arquivo esparso, com o mesmo comprimento que antes, mas como todos os 0s que não precisam ser armazenados no disco.

Não use isso na produção ou em qualquer lugar onde esse arquivo excluído seja ruim. Isso torna o arquivo ilegível assim que é iniciado, por isso, se algo der errado, por exemplo, você fica sem espaço no disco rígido enquanto extrai, você não terá uma segunda chance de executar isso.

    
por 17.10.2013 / 02:02
2

Eu não sei de nenhuma ferramenta que possa fazer isso, e não acho que nenhum dos formatos comuns de arquivamento suportem isso.

Uma possível solução para o seu problema seria manter o arquivo em uma máquina diferente e encaminhá-lo para a máquina em que você deseja descompactá-lo. Por exemplo, você poderia executar este comando na máquina com o arquivo:

cat archive.tar.gz | ssh YOUR_SERVER tar xfz -

O arquivo será transmitido para o processo tar em execução no servidor, que o descompactará sem precisar que o arquivo esteja presente no servidor.

    
por 16.10.2013 / 20:35
2

Embora seja impraticável expandir o armazenamento primário, talvez você possa extrair o conteúdo do arquivo para um dispositivo de armazenamento externo.

Como alternativa, gere uma lista de arquivos no archive e, em seguida, escreva um script que extraia alguns deles. Mova esses arquivos para a nuvem, selecione outro lote para extrair, ensaboar, enxaguar, repetir.

Mas, todo aplicativo de arquivamento que eu conheço tem que ter o arquivo original intacto enquanto ele cria um novo arquivo sem o que você não quer, então o armazenamento externo será muito, muito útil.

    
por 16.10.2013 / 20:29