Como faço para compactar arquivos no local?

18

Eu tenho uma máquina com 90% de uso de disco rígido. Eu quero compactar seus 500 arquivos de log em um novo arquivo menor. No entanto, o disco rígido é muito pequeno para manter os arquivos originais e compactados.

Então, o que preciso é compactar todos os arquivos de log em um único arquivo novo, um por um, excluindo cada original, uma vez compactado.

Como posso fazer isso no Linux?

    
por Zen 29.04.2015 / 09:51

4 respostas

17

gzip ou bzip2 compactará o arquivo e removerá o não compactado automaticamente (esse é o comportamento padrão).

No entanto, tenha em mente que, enquanto o processo de compactação, ambos os arquivos existirão.

Se você quiser compactar arquivos de log (isto é: arquivos que contenham texto), você pode preferir bzip2 , pois ele tem uma melhor proporção para arquivos de texto.

bzip2 -9 myfile       # will produce myfile.bz2

Comparação e exemplos:

$ ls -l myfile
-rw-rw-r-- 1 apaul apaul 585999 29 april 10:09 myfile

$ bzip2 -9 myfile

$ ls -l myfile*
-rw-rw-r-- 1 apaul apaul 115780 29 april 10:09 myfile.bz2

$ bunzip2 myfile.bz2

$ gzip -9 myfile

$ ls -l myfile*
-rw-rw-r-- 1 apaul apaul 146234 29 april 10:09 myfile.gz

UPDATE como @jjoao me disse em um comentário, curiosamente, xz parece ter uma melhor proporção em arquivos simples com suas opções padrão:

$ xz -9 myfile

$ ls -l myfile*
-rw-rw-r-- 1 apaul apaul 109384 29 april 10:09 myfile.xz

Para mais informações, aqui está uma referência interessante para diferentes ferramentas: link

Para o exemplo acima, eu uso -9 para uma melhor taxa de compactação, mas se o tempo necessário para compactar dados for mais importante que a taxa, convém não usá-lo (use uma opção inferior, ou seja, -1 , ou algo entre).

    
por 29.04.2015 / 10:05
10

Eu descobri uma solução de alcatrão sozinho.
Exclui um único arquivo depois de compactado no arquivo de destino.
A velocidade de compactação não é muito rápida, no entanto. O comando parece com:

tar -zcvf my_log.tar.gz *.log --remove-files
    
por 29.04.2015 / 10:08
2

Eu estava tentando fazer isso na versão BSD do tar. Nesse caso, a opção --remove-files não está disponível. O que acabei fazendo (e trabalhei) foi:

find folder_to_tar -type f -exec tar --append --file=output_tar_file.tar {} \; -exec rm -v {} \;
    
por 14.01.2017 / 23:18
1

Em complemento a @apaul, enfatizo que compactar arquivos individualmente

 bzip2 *.log.*

(substitua o bzip2 por gzip, xz ou o que for o seu arquivo favorito) pode ser importante:

Dessa forma, você ainda pode ver ( bzcat file.bz2 ), pesquisar ( bzgrep file.bz2 ), editar ( vi file.bz2 ) o arquivo compactado e remova os mais antigos quando necessário.

    
por 29.04.2015 / 10:42