Linux Essencial/Lição Compactando e descompactando arquivos

Origem: Wikilivros, livros abertos por um mundo aberto.
  • Objetivo(s): Oferecer conhecimentos sobre os compactadores de arquivo e seu uso via linha de comando.
  • Direitos autorais e licença: Veja notas de direitos autorais e licença no final da lição.

Compactadores[editar | editar código-fonte]

Uma das formas mais importantes encontradas para o armazenamento e transporte das informações por um meio não ativo (disquete por exemplo) é a compactação, que nada mais é do que diminuir o seu tamanho físico sem que haja a perda do valor interno.

Um compactador ao receber um arquivo como entrada fará com que todos os dados iguais sejam armazenados num mesmo local, e ao descompactá-los eles serão depositados no local escolhido pelo usuário.

Inicialmente todas as ferramentas e formatos de compactação estão disponíveis em ambiente GNU/Linux. Os algoritmos de compactação empregados nas diferentes ferramentas possuem características bem singulares, com vantagens e desvantagens entre si. Enquanto um é melhor sobre arquivos do tipo texto, outro é melhor para figuras e assim por diante. Na hora da criação de novos arquivos compactados, a escolha por um formato fica a gosto do usuário. Ao receber arquivos em um determinado formato, só resta-nos utilizar a ferramenta correspondente.

Tipos de compactadores[editar | editar código-fonte]

bzip2[editar | editar código-fonte]

O compactador bzip2 é um dos mais comuns e eficientes dentre os compactadores existentes para o sistema GNU/Linux.

Sintaxe:

bzip2 [-opção] nome_arquivo

Opção:

k - mantém o arquivo original (backup)

q - compacta mesmo com erro

d - descompacta o arquivo do tipo .bz2

f - sobrescreve o arquivo já existente

help - chama ajuda

A opção "f " que sobrescreve um arquivo existente pode ser útil nos casos de alteração de arquivo corrompido dentro de um sistema, sem haver a necessidade de removê-lo primeiro, tal como funciona em cópias ou remoções de arquivos.

Um arquivo, ao ser compactado pela ferramenta bzip2, terá a sua extensão acrescida de .bz2.

Para a descompactação de um arquivo podem ser selecionados dois modos, um que é mais comum aos descompactadores, a colocação das letras un (usado para negação em inglês) na palavra, que para este caso seria:

bunzip2, conforme a sintaxe:

bunzip2 [-opção] nome_arquivo.bz2

Opção:

f - sobrescreve o arquivo se existente

Outra forma é passar a opção -d (descompacta arquivos do tipo .bz2) junto com o comando de compactação, ficando com o seguinte formato:

bzip2 -d nome_arquivo.bz2

possuindo o mesmo efeito que o bunzip2.

Exemplo de compactação de um arquivo qualquer:

$bzip2 teste

$ls -l teste*

-rw-r--r--   1 aluno    aluno        4147 Feb 21 11:01 teste.bz2

Exemplo de descompactação do arquivo anterior:

$bunzip2 teste.bz2

$ls -l teste*

-rw-r--r--   1 aluno     aluno        25223 Dec 21 11:01 teste

gzip[editar | editar código-fonte]

Gzip é um compactador muito conhecido no sistema Linux, tendo uma boa aceitação por parte dos usuários que realizam testes com ele. A sua compactação é melhor vista em arquivos dos tipos texto ou figura, sobre o ponto de vista de alguns outros compactadores. Este compactador também é muito utilizado no término de um novo programa, que junto com os scripts (programas gerenciadores), que são passados para os usuários, para maiores detalhes vide tópico sobre gerenciamento de arquivos.

Um arquivo quando é compactado com o gzip não deixa uma cópia do arquivo original. É recomendado fazer uma cópia de segurança antes de passar o compactador.

A extensão gerada com esta ferramenta é o .gz, mantendo todas as informações originais, tais como o proprietário, as permissões e a data de criação.

-rw-rw----    1 cleberjr cleberjr      556 Nov 18 10:01 margem.swf

[cleberjr@saproad cleberjr]$ chmod 666 margem.swf
[cleberjr@saproad cleberjr]$ gzip margem.swf
[cleberjr@saproad cleberjr]$ ls -l margem.swf.gz

-rw-rw-rw-    1 cleberjr cleberjr      590 Nov 18 10:01 margem.swf.gz

[cleberjr@saproad cleberjr]$ chmod 660 margem.swf.gz
[cleberjr@saproad cleberjr]$ gunzip margem.swf.gz
[cleberjr@saproad cleberjr]$ ls -l margem.swf

-rw-rw----    1 cleberjr cleberjr      556 Nov 18 10:01 margem.swf

Sintaxe:

gzip [-opção] nome_arquivo/diretório

Opção:

f - força a descompactação sobre arquivos existentes e compactação sobre links simbólicos;

r - trabalha de forma recursiva sob diretórios;

t - testa a integridade do arquivo compactado;

d - descompacta o arquivo do tipo .gz;

h - chama a ajuda.

Uma vantagem desta ferramenta é a possibilidade de compactar diretórios também, e a principal desvantagem é de não existir opção para manter o arquivo original e criar outro compactado.

Exemplo:

$ gzip teste

$ ls -l

-rw-r--r--   1 aluno     aluno   4926 Feb 21 11:01 teste.gz

Para a descompactação existem duas formas:

gunzip nome_arquivo.gz

ou 

gzip -d nome_arquivo.gz

Exemplo:

$ gunzip teste.gz

$ ls -l teste* 

-rw-r--r--    1 aluno    aluno    25223 Feb 21 11:01 teste 

zip[editar | editar código-fonte]

O compactador zip além de um utilitário para a compactação serve também como empacotador (para melhor entendimento sobre empacotadores veja tópico sobre a ferramenta tar), tendo como principal função a sua portabilidade, ou seja, esta ferramenta é compatível com outros sistemas de compactação do tipo pkzip e similares.

Quando for desejado a compactação de vários arquivos em um só arquivo, o zip é muito útil, pois em sua própria sintaxe é solicitado um nome para ser o arquivo principal (não pode ser um arquivo existente) evitando assim a perda do arquivo originário.

Sintaxe:

zip [-opção] arquivo.zip arquivo1 arquivo2 ... arquivoN

Para esse caso o arquivo arquivo.zip será criado no momento da compactação e ele não precisa necessariamente possuir a extensão .zip, ela é colocada para facilitar a sua identificação.

Opções:

r - trabalha de forma recursiva sobre diretórios;

T - testa a integridade do arquivo de zip;

h - apresenta a ajuda;

D - não adiciona diretórios quando solicitado uma pasta inteira.

A opção D pode ser utilizada quando for necessário copiar somente os arquivos que estão dentro de uma pasta, mas que exista além dos arquivos um diretório, sendo este não necessário, excluindo assim este diretório.

Para a descompactação e desempacotamento é utilizado o seguinte comando:

unzip nome_arquivo.zip

Exemplo:

$ zip arquivo.zip teste teste1

updating: teste (deflated 81%)
updating: teste1(deflated 75%)

$ ls l arquivo*

-rw-r--r--  1 aluno     aluno     10046 Feb 21 11:15   arquivo.zip

Exemplo de descompactação

$ unzip arquivo.zip

Archive:  arquivo.zip

[aluno@lab20 aluno]$ ls -l

-rw-r--r--  1 aluno     aluno     25223 Feb 21 11:01   teste
-rw-r--r--  1 aluno     aluno     20046 Feb 21 11:13   teste1
-rw-r--r--  1 aluno     aluno     1121 Feb 21 11:15    arquivo.zip

Note que o arquivo original (compactado) não é perdido após a sua descompactação.

tar[editar | editar código-fonte]

O TAR é um empacotador, que permite o armazenamento de vários arquivos e até mesmo diretórios dentro de um único arquivo, para diversas utilidades, entre elas estão o backup do sistema e para transporte.

Quando é dito que vários arquivos podem ser empacotados, não indica que o mesmo será compactado, pois são duas operações distintas. No caso do compactador, os arquivos serão comprimidos tendo assim o seu tamanho de alocação em disco diminuído, enquanto que o empacotador estará preocupado em juntar vários arquivos ou diretórios dentro de um único arquivo.

As chamadas “tarballs”, ou arquivos “.tar.gz”, são na realidade, um pacote tar (contendo diversos arquivos), compactado com a ferramenta gzip. Resultados semelhantes são obtidos através do uso do tar em conjunto com o bzip2 (estes geralmente possuem terminação “.tar.bz2”).

Sobre um arquivo empacotado pode ser realizado várias tarefas, entre elas estão: criar, retirar os arquivos, acrescentar novos arquivos, ler o seu conteúdo, entre outros.

Sintaxe:

tar [-opção][argumentos] nome_do_arquivo.tar arquivo1 ... arquivon 

Opção:

c - cria um novo arquivo empacotado;

p - retira os arquivos empacotados mantendo suas informações originais;

r - inserir um novo arquivo aos empacotados;

x - retira os arquivos empacotados dentro do diretório corrente;

t - lista todo o conteúdo do arquivo empacotado.

Argumentos:

C - diretório - indica para o sistema que será especificado um diretório para a desempacotação dos arquivos;

f - arquivo - indica para o sistema que será especificado um arquivo;

h - não copia links simbólicos, e sim os arquivos para os quais elas apontam;

v - indica para o sistema informar o processamento de empacotamento conforme ele vai sendo realizado;

z - compacta os arquivos empacotados após o processo com a ferramenta de compactação gzip;

j - compacta os arquivos empacotados após o processo com a ferramenta de compactação bzip2.

Sobre os argumentos os mais utilizados são “v”, para a visualização do que está ocorrendo, o “z”, para a compactação do pacote e o “f” para a informação do arquivo geral (a ordem das letras utilizadas não influencia no resultado assim como em outros casos de comandos com opções)

Exemplo:

$ tar cvf zteste.tar zlogin  zlogout  zprofile  zshenv  zshrc

$ ls

zlogin  zlogout  zprofile  zshenv  zshrc  zteste.tar

Os arquivos originais não foram apagados, e sim criado uma cópia para dentro de zteste.tar.

Para confirmar se tudo deu certo, deve ser gerada uma lista sobre os arquivos que estão dentro do pacote:

$ tar tvf zteste.tar

zlogin
zlogout
zprofile
zshenv
zshrc

Se nenhum erro for retornado o pacote está perfeito.

Empacotando e compactando ao mesmo tempo com a ferramenta de compactação gzip:

$ tar cvfz zteste.tar.gz zlogin  zlogout  zprofile  zshenv  zshrc

$ ls

zlogin  zlogout  zprofile  zshenv  zshrc  zteste.tar.gz

A extensão “gz” informa que o pacote também foi compactado.

O desempacotamento é muito simples, sendo que deverá ser informado para o sistema a opção “x”:

$cp zteste.tar /tmp/

$cd /tmp

$tar xvf zteste.tar

$ls

zlogin  zlogout  zprofile  zshenv  zshrc  zteste.tar

O arquivo original zteste.tar irá permanecer no sistema, para servir como backup se caso ocorra alguma coisa com os arquivos descompactados, devendo ser apagado manualmente do sistema, se o usuário assim o preferir.

Caso o pacote esteja compactado deverá ser informado, junto com as demais opções, o argumento sobre a ferramenta de compactação, sendo, “z” para o gzip (gz) e “j” para o bzip2 (bz2).

Comparativo entre os compactadores[editar | editar código-fonte]

Aqui está um comparativo dos compactadores vistos utilizando um arquivo relativamente pequeno( um arquivo em PDF).

compactador tamanho original do arquivo tamanho novo taxa de compressão
bzip2 11.1 MB (11631660 bytes) 10.4 MB (10856335 bytes) 6,665643597%
gzip 11.1 MB (11631660 bytes) 10.3 MB (10813183 bytes) 7,036631057%
zip 11.1 MB (11631660 bytes) 10.3 MB (10813347 bytes) 7,035221112 %

Agora um comparativo com um arquivo maior (um arquivo de vídeo):

compactador tamanho original do arquivo tamanho novo taxa de compressão
bzip2 238,8 MB (250437044 bytes) 236,8 MB (248319817 bytes) 0,84541287 %
gzip 238,8 MB (250437044 bytes) 236,1 MB (247617747 bytes) 1,125750789 %
zip 238,8 MB (250437044 bytes) 236,1 MB (247617868 bytes) 1,125702474 %

Terminologia Utilizada[editar | editar código-fonte]

Superusuário
usuário responsável pelo sistema, possui todos os direitos sobre o sistema.
Sistema
o computador em si, com as funcionalidades de hardware e software.
Login
acesso ao sistema utilizando um usuário conhecido e uma senha válida
Logout
finalizar a sessão de acesso do usuário que efetuou login no sistema
Compactador
ferramenta que auxilia a reduzir o tamanho de um arquivo ou diretório
Empacotador
ferramenta que aglutina (junta) vários arquivos ou diretórios em um único arquivo
Raiz
designação dada para o /, simboliza o ponto de inicio para todo o sistema

Exercícios de Revisão[editar | editar código-fonte]

1. É possível empacotar diretórios?

2. Apresente os passos para gerar um arquivo empacotado e compactado, depois listar o seu conteúdo, mover para o diretório /tpm e desempacotar lá.

3. Como seria a leitura do arquivo mensagem.gz, primeiramente descompactando e depois sem descompactar?