Linux: compactando e descompactando arquivos com o zip

Linux: compactando e descompactando arquivos com o zip

A compactação e descompactação de diretórios e arquivos é uma tarefa bastante comum no dia a dia. Podemos compactar um diretório para enviar para um amigo ou realizar um backup. Talvez para alguns usuários, mais comum que a compactação seja a descompactação: no nosso cotidiano podemos baixar arquivos compactados dos mais diversos tipos e, naturalmente precisaremos descompactá-los para que seja possível utilizá-los devidamente.

O objetivo da compactação é unir vários arquivos em um só, fazendo também com que o arquivo final fique menor e seja mais fácil de transferir. Isso é feito através de programas compactadores de arquivos, que utilizam algoritmos para que seja possível reduzir o tamanho dos dados que serão compactados.

Um dos formatos de compactação bastante conhecido é o zip. Você certamente já viu algum arquivo com extensão .zip em sua vida. No Linux, para compactar no formato .zip utilizamos o comando zip. Tenho um diretório, dentro do diretório do meu usuário (/home/nome_do_usuario) que contém alguns projetos, vamos ver o conteúdo desse diretório através do comando $ ls -l Projetos/.

Banner promocional da Alura, com um design futurista em tons de azul, apresentando dois blocos de texto, no qual o bloco esquerdo tem os dizeres:

Note que utilizei o argumento -l junto ao ls para obter uma lista mais detalhada. O "d" no início de cada linha indica que temos dois diretório dentro de Projetos (GeradorDeXML e GeradorDeJSON).

ls_l

Vamos compactar a pasta projetos utilizando o zip. Para isso basta passar para o comando o nome do arquivo que irá conter os dados compactados e o que desejamos compactar.


$ zip projetos.zip Projetos/ adding: Projetos/ (stored 0%)

Compactamos o diretório Projetos/ para um arquivo zip. E para descompactar? Será que temos que usar zip -alguma coisa? Na verdade, para fazermos a descompactação utilizamos um outro comando, o unzip.

Mas antes vamos listar os arquivos que estão inclusos no nosso arquivo .zip. Para isso basta utilizar o argumento -l (list).


$ unzip -l projetos.zip Archive: projetos.zip Length Date Time Name --------- ---------- ----- ---- 0 2016-05-01 15:02 Projetos/ --------- ------- 0 1 file

Espera aí! Dentro do arquivo projetos.zip existe apenas o diretório Projetos/. O que houve com os diretórios GeradorDeJSON e GeradorDeXML?

Acontece que, por padrão, o zip não inclui os arquivos e subdiretórios de um diretório, por isso nosso .zip contém apenas o diretório Projetos/ vazio. Para resolver isso é fácil: basta passar o argumento -r (recursive).


$ zip -r projeto.zip Projetos/ updating: Projetos/ (stored 0%) updating: Projetos/GeradorDeXML/ (stored 0%) updating: Projetos/GeradorDeXML/GeradorXML.java (deflated 53%) updating: Projetos/GeradorDeJSON/ (stored 0%) updating: Projetos/GeradorDeJSON/GeradorJSON.java (deflated 53%)

Veja só! A saída do zip já foi diferente. Vamos listar o conteúdo do .zip gerado.


$ unzip -l projeto.zip Archive: projeto.zip Length Date Time Name --------- ---------- ----- ---- 0 2016-05-01 18:03 Projetos/ 0 2016-05-01 18:00 Projetos/GeradorDeXML/ 594 2016-04-25 14:08 Projetos/GeradorDeXML/GeradorXML.java 0 2016-05-01 18:00 Projetos/oi.txt 0 2016-05-01 18:00 Projetos/GeradorDeJSON/ 594 2016-04-25 14:08 Projetos/GeradorDeJSON/GeradorJSON.java --------- ------- 1188 6 files

Agora sim! Os subdiretórios foram incluídos. Perceba que o zip, por padrão, informa na saída do terminal todos os diretórios e subdiretórios que estão sendo compactados. O unzip funciona da mesma forma na descompactação. Para que isso não ocorra, podemos utilizar o argumento -q (quiet).

Vamos primeiro excluir o diretório Projetos/ para que no momento da descompactação o diretório seja criado novamente.


$ rm -r Projetos/ $ unzip -q projeto.zip

Pronto! O arquivo foi descompactado e temos a estrutura de diretórios de antes.

Vimos como utilizar o zip para compactação e descompactação de arquivos. Em breve um outro post será publicado onde será utilizado o tar para realizar a compactação e descompactação.

Cursos de uma série preparatória para a certificação Linux Essentials também estão sendo lançados!

Veja outros artigos sobre DevOps