Como compactar arquivos extremamente grandes no lugar

2

Eu preciso compactar um arquivo de 646,4 GB em um disco rígido externo de 1 TB. Este HDD tem atualmente cerca de 238.6 GB livres. No entanto, como os métodos simples de compactação criam um novo arquivo, não poderei compactar esse arquivo, que é um arquivo .vhdx (uma imagem do sistema Windows). Eu tenho acesso a sistemas Windows (10 Tech Preview) e Unix (ambos Mac e Ubuntu, se isso ajudar).

Eu preciso de alguma maneira para compactar esses arquivos no lugar ou de alguma forma para dividir este arquivo em vários arquivos menores sem deixar o enorme 646.4GB como é (ou seja, de alguma forma que exclui os dados deste arquivo como é feito usando-o ). Obrigado!

    
por Ben Sandeen 01.07.2015 / 06:42

4 respostas

2

Sim, isso pode ser feito.

Prova de conceito:

Deixe-me obter um arquivo para testar:

cp /bin/sh mylargefile

ls -l
-rw-r--r--  1 hennes  users  137208 Jul  1 20:05 my_large_file

Vamos dividir em 3 partes, a primeira parte será 50k, a segunda será 50k, a terceira será 37k. Começamos no final com a terceira parte.

 dd if=my_large_file of=part3 bs=1k skip=100
 33+1 records in
 33+1 records out
 34808 bytes transferred in 0.000232 secs (150046592 bytes/sec)

 ~/test$ ls -l
total 180
-rw-r--r--  1 hennes  users  137208 Jul  1 20:05 my_large_file
-rw-r--r--  1 hennes  users   34808 Jul  1 20:09 part3

Ok, podemos copiar parte do arquivo. Agora vamos truncar o arquivo grande original para 100000 bytes

truncate  -s 100000 my_large_file
[hennes@dragon] ~/test$ ls -l
total 144
-rw-r--r--  1 hennes  users  100000 Jul  1 20:17 my_large_file
-rw-r--r--  1 hennes  users   34808 Jul  1 20:09 part3

Comprima com seu programa favorito. Por exemplo,

bzip2 -9 part3
[hennes@dragon] ~/test$ ls -l part3.bz2
-rw-r--r--  1 hennes  users  11773 Jul  1 20:09 part3.bz2

Enxagúe e repita:

dd if=my_large_file of=part2 bs=1k skip=50
47+1 records in
47+1 records out
48800 bytes transferred in 0.024526 secs (1989735 bytes/sec)

Novo dd com números diferentes. Novo truccate com números diferentes. ...

Se você fizer isso sem o maior cuidado, você provavelmente vai se atrapalhar!

Os exemplos acima já são uma mistura de KB e KiB. Tome cuidado extra com seus números.

Além disso, faça um backup. O que significa que você já tem o dobro do espaço para que isso não seja necessário. Use somente se você precisar demonstrar alguma coisa (por exemplo, lição de casa ou como prova de conceito durante uma entrevista de emprego) e por sua conta e risco.

    
por 01.07.2015 / 20:24
3

No Windows, clique com o botão direito do mouse no arquivo e selecione Propriedades, em seguida, a guia Geral e, em seguida, o botão Avançado, marque comprimir conteúdo para economizar espaço em disco. Isso funciona para arquivos ou pastas individuais.

    
por 02.07.2015 / 18:30
1

BIG WARN: NÃO POSSO GARANTIR ESTE CÓDIGO DE SCRIPT SEGURO !!

No meu Debian Stretch eu encontro o mesmo problema.
Eu não conheço nenhuma ferramenta liberada fazer esta tarefa, então eu faço um script de shell simples para mim ( $1 é o arquivo grande):
Para compressa:

#!/bin/sh -e
#in-place compress single large file
compressor="lz4"
! test -d ./small-files && mkdir ./small-files
while true; do
size="$(stat -c%s ${1})"
block="$((1024*1024*1024))"
if [ "${size}" -gt "${block}" ] ; then
tail --bytes "${block}" "$1" | ${compressor} > "./small-files/$((${size}-${block}))"
sync
truncate -s "$((${size}-${block}))" "${1}"
sync
elif [ "${size}" -gt "0" ] ; then
tail --bytes "${block}" "$1" | ${compressor} > "./small-files/0"
sync
truncate -s "0" "${1}"
sync
else
break
fi
done
echo "success"

Para descomprimir:

#!/bin/sh -e
#in-place decompress single large file
decompressor="lz4cat"
for size in $(ls -1 ./small-files | sort -n) ; do
truncate -s "${size}" "./${1}"
sync
${decompressor} "./small-files/${size}" >> "./${1}"
sync
rm "./small-files/${size}"
sync
done
echo "success!"

Para soma de verificação:

#!/bin/sh -e
#in-place check compressed single large file
origincat () {
decompressor="lz4cat"
for size in $(ls -1 ./small-files | sort -n) ; do
${decompressor} "./small-files/${size}"
done
}
origincat | md5sum
    
por 22.09.2018 / 12:52
0

Se o arquivo VHD tiver janelas nele, presumo que seja porque você diz "Imagem do sistema do Windows".

Talvez seja melhor montar o VHD. Em seguida, use uma ferramenta como o imagex da Microsoft para compactar a unidade em um arquivo de imagem.

imagex /capture /flags "professional" c: n:\images\windows.wim "Win"
    
por 22.09.2018 / 14:41