4. Arquivamento e Compactação de Dados

4.1. tar: Tape ARchiver

Assim como o find, o tar é um utilitário UNIX® de longa data, então a sua sintaxe é um pouco especial:

tar [opções] [arquivos...]

Vamos apresentar abaixo uma lista de algumas opções disponíveis para o tar. Note que todas elas possuem uma opção equivalente com um formato lngo, mas você terá que pesquisá-las em tar(1), já que não trataremos delas neste guia.

[Nota]Nota

O hífen (-) que precede as opções no formato curto não é mais utilizado pelo tar, sendo exigido apenas para as opções no formato longo.

  • c: utilizado para criar um novo arquivo tar.

  • x: utilizado para extrair os arquivos existentes em um arquivo tar.

  • t: lista os arquivos existentes em um arquivo tar.

  • v: aumenta a verbosidade. Lista os arquivos que estão sendo adicionados ou extraídos de um arquivo tar. Se utilizado em conjunto com a opção t (veja abaixo), é exibida uma listagem longa dos arquivos.

  • f <nome_do_arquivo>: cria um arquivo com o nome nome_do_arquivo, extrai ou lista os arquivos contidos em nome_do_arquivo. Se este parâmetro for omitido, o arquivo padrão será o /dev/rmt0, que é, de maneira geral, um arquivo especial associado a um streamer. Se o valor do parâmerto for - (um hífen), a entrada ou a saída (dependendo da operação que você está realizando) será associaad à entra ou saída padrão.

  • z: informa ao tar que o arquio a ser criado deve ser comprimido com o gzip, ou que o arquivo a ser extraído está comprimido com o gzip.

  • j: faz o mesmo que a opção z, mas utiliza o bzip2 para comprenssão do arquivo.

  • p: preserva o atributo dos arquivos que são extraídos, incluindo o dono do arquivo, o último acesso e outros. Muito útil para cópias de sistemas de arquivo.

  • r: adiciona os arquivos indicados na linha de comando a um arquivo tar exisente. Note que o arquivo tar não deve estar comprimido para poder receber novos arquivos.

  • A: concatena o conteúdo de arquivos tar passados na linha de comando ao arquivo tar indicado com a opção f. Assim como na opção r, o arquivo tar não deve estar comprimido.

Há muitas outras opções que não estão listadas aqui, e você pode encontrar uma lista completa em tar(1). Veja, por exemplo, a opção d.

Vamos seguir com um exemplo. Digamos que você queira arquivar todas as imagens do diretório /shared/images, em um arquivo comprimido com o bzip2 e chamado imagens.tar.bz2 dentro do seu diretório /home. Você então digitaria:

 #
 # Nota: você deve estar no diretório em que
 #  estão os arquivos que você quer compactar!
 #
$ cd /shared
$ tar cjf ~/imagens.tar.bz2 images/

Como você pode ver, nós utilizamos três opções aqui: c informa ao tar que nós queremos criar um arquivo, a opção j serve para comprimí-lo com o bzip2, e f ~/imagens.tar.bz2 que o arquivo será criado em nosso diretório home e que deverá ser chamado imagens.tar.bz2. Agora nós podemos fazer um teste com o arquivo pedindo para listar o seu conteúdo:

 #
 # Volte ao diretório home do usuário
 #
$ cd
$ tar tjvf imagens.tar.bz2

Aqui nós dizemos ao tar para listar (t) os arquivos compactados em imagens.tar.bz2 (f imagens.tar.bz2), informando que este arquivo foi compactado com o bzip2 (j), e que quermos uma listagem longa (v). Agora, digamos que você apagou o diretório das imagens. Felizmente o seu arquivo ainda está intacto e agora você quer extrair o conteúdo dele para onde ele estava antes, no diretório /shared. Mas como você quer continuar a verificar as imagens novas com o comando find, você precisará preservar os atributos das imagens quando extraí-las:

 #
 # acesse o diretório onde você quer extrair os arquivos
 #
$ cd /shared
$ tar jxpf ~/imagens.tar.bz2

Pronto, imagens estão recuperadas!

Mas vamos supor que você queira extrair do arquivo apenas o diretório images/cars e mais nada. Assim você pode executar:

$ tar jxf ~/imagens.tar.bz2 images/cars

Se você tentar fazer uma cópia de seguraça de arquivos especiais, o tar irá copiá-los da maneira como eles são, arquivos especiais, e não irá copiar os seus conteúdos.Sendo assim, você pode fazer uma cópia do arquivo /dev/mem, por exemplo, em um arquivo tar. Ele também lida de maneira correta com links. Para links simólicos, dê uma olhada na opção h na página do manual do programa.

4.2. bzip2 e gzip: Compressão de Dados Programs

Nós já vimos estas aplicações trabalhando em conjunto com o tar. Mas diferentemente do WinZip® no Windows®, o arquivamento e a compresão aqui são feitos por utilitários separados: tar para o arquivamento, e os dois programa que vamos ver agora para a compressão de dados: bzip2 e gzip. Você também pode utilizar outras ferramentas para compressão, como o zip, arj ou rar, pois eles também estão disponíveis no GNU/Linux, embora sejam raramente utilizados.

O bzip2 foi escrito como um substituto ao gzip. Sua taxa de compressão é melhor que a do gzip, mas em contrapartida, ele exige mais recursos do sistema. Além disso, o gzip ainda é bastante utilizado por motivos de compatibilidade com sistemas antigos.

Ambos os comandos possuem uma sintaxe semelhante:

gzip [opções] [arquivo(s)]

Se nenhum nome de arquivo for indicado, tanto o gzip quato o bzip2 irão receber os dados da entrada padrão e enviar o resultado para a saída padrão. Assim, você pode usar os dois comandos em redirecionamentos com pipes. Ambos os comandos também possuem algumas opções em comum:

  • -1, ..., -9: indica a taxa de compressão. Quanto maior o número, maior a compressão. E por isso o processo também será mais lento.

  • -d: descomprimir arquivo(s).

  • -c: exibe na saída padrão o resultado da compactação/descompactação dos arquivos indicados nos parâmetros.

[Atenção]Atenção

Por padrão o gzip e o bzip2 apagam o(s) arquivo(s) que eles compactaram (ou descompactaram) se você não usar a opção -c. Você pode evitar isso no bzip2 utilizando a opção -k. O gzip não possui uma opção equivalente.

Agora alguns exemplos. Vamos dizer que você quer compactar todos os arquivos que terminam com .txt no diretório em que você está utilizando o bzip2 com compressão máxima. Você então poderia executar:

$ bzip2 -9 *.txt

Vamos supor que você quer compartilhar as suas imagens compacadas com alguém, mas esta pessoa não possui o bzip2 no sistema, apenas o gzip. Você não precisa descompactar o arquivo e recompactá-lo, você pode descompacta-lo para a saída padrão, usar um pipe, compactar da entrada padrão e redirecionar a saída para o novo arquivo. Desta forma:

bzip2 -dc imagens.tar.bz2 | gzip -9 >imagens.tar.gz

Você poderia ter usado o bzcat em vez do bzip2 -dc. Há um equivalente para o gzip mas o seu nome é zcat, e não gzcat. Também existe o bzless para arquivos bzip2 e o zless para a gzip se você quiser visualizar diretamente os arquivos compactados, sem a necessidade de descompactá-los antes. Como exercício, tente encontrar o comando que você deveria digitar para visualizar arquivos compactados sem a a necessidade de desompactá-los, e sem utilizar o bzless ou zless.