Eu tenho uma unidade de 100 GB que tem um arquivo de 95 GB. Preciso liberar algum espaço na unidade (e agora não é possível transferir o arquivo da unidade). O arquivo seria compactado com gzip
ou com o que quer que bz2
seja, mas todos esses programas gravam o arquivo compactado em um arquivo separado. Não tenho espaço livre suficiente para isso.
Existe uma maneira de usar ferramentas de compactação padrão ou outros utilitários Unix para compactar o arquivo sem usar espaço em disco adicional (ou pelo menos uma quantidade mínima de espaço em disco adicional)? Estou imaginando algo que comprime parte do arquivo por vez e grava os resultados diretamente sobre o arquivo. Sei que isso seria arriscado, pois o arquivo seria corrompido se a compactação fosse interrompida, mas acho que não tenho escolha.
fonte
Respostas:
Esta é uma prova de conceito bash one-liner, mas deve começar. Use por sua conta e risco.
Isso funciona canalizando dados gz para um processo dd que os grava novamente no mesmo arquivo. Após a conclusão, o arquivo é truncado para o tamanho da saída gz.
Isso pressupõe que a última linha da saída do dd corresponda:
Onde o primeiro campo é um número inteiro de bytes gravados. Esse é o tamanho em que o arquivo precisará ser truncado. Não tenho 100% de certeza de que o formato de saída seja sempre o mesmo.
fonte
conv=notrunc
é necessário?gzip -c file | dd of=file
parece funcionar tão bem.gzip
) grave mais bytes de cabeçalho e de dados que os bytes de dados originais, substituindo algumas partes do arquivo? Eu acho que isso depende do programa de compactação escolhido. Alguém tem uma idéia de como impedir que isso aconteça ou quão (im) provável é?Não é tanto isso
gzip
ebzip2
sobrescreve o original. Em vez disso, eles gravam os dados compactados no disco como um novo arquivo e, se essa operação for bem-sucedida, desvincularão o arquivo original não compactado.Se você tiver RAM suficiente, poderá escrever um script para compactar temporariamente os arquivos em um
tmpfs
sistema de arquivos, remover o original no disco e substituí-lo pela versão compactada. Talvez algo parecido com isto:Apenas tenha em mente o uso de memória, pois
tmpfs
é essencialmente um disco RAM. Um arquivo de saída grande pode facilmente causar fome no sistema e causar outros problemas para você.fonte
Não existe ferramenta que funcione dessa maneira, exatamente pelo motivo que você indica. Poucas pessoas estão dispostas a escrever uma ferramenta que implemente deliberadamente comportamentos de risco.
fonte
Os comandos split e csplit podem ser usados para dividir o arquivo grande em partes menores e compactá-los individualmente. Remontar seria bastante demorado embora.
fonte