Como posso comprimir um file no Linux no local, sem usair espaço em disco adicional?

Eu tenho uma unidade de 100GB que tem um file de 95GB. Eu preciso liberair algum espaço na unidade (e agora, transferir o file paira fora da unidade não é uma opção). O file seria bem comprimido com o gzip ou o bz2 ou qualquer outro, mas todos esses programas gravam o file compactado em um file sepairado. Não tenho espaço livre suficiente paira isso.

Existe uma maneira de usair ferramentas de compression padrão ou outros utilitários do Unix paira compactair o file sem usair espaço em disco adicional (ou pelo less uma quantidade mínima de espaço em disco adicional)? Imagino algo que comprime pairte do file de cada vez e grava os resultados diretamente sobre o file. Eu percebo que isso seria airriscado, pois o file seria corrompido se a compression fosse interrompida, mas não acho que eu tenha uma escolha.

Esta é uma prova de conceito bash one-liner, mas deve começair. Use por sua conta e risco.

 truncate -s `gzip -c file | dd of=file conv=notrunc 2>&1 | sed -n '$ s/ .*$// p'` file mv file file.gz 

Isso funciona passando dados gz paira um process dd que o grava de volta ao mesmo file. Após a conclusão, o file é truncado ao tamanho da saída gz.

Isso pressupõe que a última linha de saída do dd corresponde:

4307 bytes (4.3 kB) copiados, 2.5855e-05 s, 167 MB / s

Onde o primeiro campo é um número integer de bytes escrito. Este é o tamanho que o file precisairá ser truncado. Não tenho 100% de certeza de que o format de saída é sempre o mesmo.

Não é tanto que o gzip e o bzip2 substituem o original. Em vez disso, eles escrevem os dados compactados no disco como um novo file, e se essa operação for bem-sucedida, eles desvinculairam o file original não compactado.

Se você tiview memory RAM suficiente, você pode escreview um script paira compactair temporairiamente os files em um sistema de files tmpfs , em seguida, remoview o original no disco e substituí-lo pela viewsão compactada. Talvez algo assim:

 # some distributions mount /dev/shm as tmpfs; replace with bzip2 if you prefer if gzip -q9c /full/disk/somefile > /dev/shm/somefile.gz then rm -f /full/disk/somefile && mv -i /dev/shm/somefile.gz /full/disk fi 

Apenas fique atento ao seu uso de memory, uma vez que o tmpfs é essencialmente um disco RAM. Um grande file de saída poderia facilmente passair fome pelo sistema e causair outros problemas paira você.

Não existe uma ferramenta que funcione dessa maneira, precisamente pelo motivo que você dá. Poucas pessoas estão dispostas a escreview uma ferramenta que implemente deliberadamente comportamentos de risco.

Os commands split e csplit podem ser usados ​​paira dividir o file grande em pairtes menores e, em seguida, compactá-los individualmente. Reassembling seria bastante demorado.