gnu linux badge

Como comprimir e descomprimir arquivos com o comando zip no Linux

Há inúmeras maneiras para fazer a compressão e a extração de arquivos no Linux. Muitas delas, pela interface gráfica — outras, no emulador de terminal.
Neste artigo, vou mostrar, através de exemplos práticos, como compactar, organizar e descompactar arquivos no formato .zip, usando o aplicativo padrão do Linux, zip — fazendo uso da linha de comando.
Ao final, vamos discutir alguns métodos de criptografia, segurança e prevenção contra crackers/hackers para dar mais segurança aos seus arquivos.
Como há vários exemplos, baseados em várias possibilidades, recomendo guardar este texto nos seus favoritos (Ctrl + D), para poder encontrar rapidamente esta referência, quando precisar.

O zip é um utilitário de empacotamento e compressão multiplataforma, que tem versões para Unix, VMS, MSDOS, OS/2, todas as versões do Windows, Minix, Atari, Macintosh, Amiga, Acorn RISC, GNU/LINUX etc.

O aplicativo é análogo à combinação dos comandos tar e compress e é compatível com o (historicamente conhecido) PKZIP, criado por Phil Katz para sistemas MSDOS, nos anos 80.
Entre as várias aplicações possíveis para o programa, citam-se sua inclusão em scripts de backup, que criam cópias de segurança, armazenam e transmitem o pacote compactado para outra mídia ou endereço na rede.
Se você tem um espaço limitado, como um DVD (4,3 GiB), é possível gravar uma quantidade muito superior de dados compactados — isto depende do tipo de arquivo envolvido.

O zip é útil para empacotar conjuntos de arquivos que você deseja distribuir juntos (Por exemplo, um programa, com suas bibliotecas e arquivos de configuração), para fazer backup, para armazenar arquivos ou diretórios que você não usa mais (ou não usa muito) em um espaço menor no disco.

A taxa de compressão máxima varia muito entre os diversos tipos de arquivos. Mas alguns autores concordam que 95% é uma média razoável — ou seja, é possível, com alguma sorte, armazenar aproximadamente 40 GiB dentro de um DVD.
Leve em conta sempre que, arquivos multimídia, como MP3, MP4, OGG, OGV, 3GP etc., já passaram por processos de compactação. Portanto, não espere resultados muito expressivos ao armazenar estes arquivos.
zipped-files-deep-purple

Como compactar uma pasta de arquivos inteira

Supondo uma série de arquivos .mp3 dentro de uma pasta ou diretório do sistema, veja este exemplo de como “empacotar” a pasta para dentro de um único arquivo compactado:

ls deep_purple/

Deep Purple - Fireball - 01 - Fireball.mp3
Deep Purple - Fireball - 02 - No No No.mp3
Deep Purple - Fireball - 03 - Demon´s Eye.mp3
Deep Purple - Fireball - 04 - Anyone´s Daughter.mp3
Deep Purple - Fireball - 05 - The Mule.mp3
Deep Purple - Fireball - 06 - Fools.mp3
Deep Purple - Fireball - 07 - No One Came.mp3
Deep_Purple_-_Fireball-back.jpg
Deep_Purple_-_Fireball-cd.jpg
Deep_Purple_-_Fireball-front.jpg

Para compactar a pasta deep_purple, use o comando zip da seguinte forma:

zip deeppurple deep_purple/*
  adding: deep_purple/Deep Purple - Fireball - 01 - Fireball.mp3 (deflated 0%)
  adding: deep_purple/Deep Purple - Fireball - 02 - No No No.mp3 (deflated 0%)
  adding: deep_purple/Deep Purple - Fireball - 03 - Demon´s Eye.mp3 (deflated 0%)
  adding: deep_purple/Deep Purple - Fireball - 04 - Anyone´s Daughter.mp3 (deflated 1%)
  adding: deep_purple/Deep Purple - Fireball - 05 - The Mule.mp3 (deflated 0%)
  adding: deep_purple/Deep Purple - Fireball - 06 - Fools.mp3 (deflated 0%)
  adding: deep_purple/Deep Purple - Fireball - 07 - No One Came.mp3 (deflated 0%)
  adding: deep_purple/Deep_Purple_-_Fireball-back.jpg (deflated 0%)
  adding: deep_purple/Deep_Purple_-_Fireball_cd.jpg (deflated 0%)
  adding: deep_purple/Deep_Purple_-_Fireball-front.jpg (deflated 1%)

Note que o arquivo deeppurple.zip já foi criado, com o sufixo ‘zip’:

ls -lh *.zip
-rw-r--r-- 1 justincase justincase 74M Ago 17 17:03 deeppurple.zip

Como armazenar arquivos ocultos

O comando anterior, compacta todos os arquivos dentro do diretório especificado. Mas não inclui os arquivos ocultos no diretório.
O diretório /home dos usuários contem vários arquivos e pastas ocultos. Muitos deles, são arquivos de configuração.
Suponha que alguém queira armazenar tudo em um flash drive (pendrive) USB para fins de backup ou para levar para outro computador.
Para ver os arquivos ocultos em seu diretório /home, use o seguinte comando:

cd
ls -la

Os arquivos ocultos são aqueles que iniciam com um ‘.’ (ponto).
Se você deseja incluir no seu arquivo compactado todos os arquivos da pasta /home (incluindo os arquivos ocultos), use o comando assim:

cd
zip home_backup * .*
_

Note que há um espaço entre ‘*’ e ‘.*’.
Esta solução não vai incluir os subdiretórios. Para isto, é necessário incluir a opção ‘-r’ (de recursividade):

zip -r home_backup .
_

Como adicionar arquivos a um pacote zip

Para adicionar novos arquivos, basta citá-los para adicioná-los ao pacote preexistente.
No exemplo, abaixo, é usada a recursividade, para incluir o conteúdo dos subdiretórios:

zip -r deeppurple.zip ~/music/ACDC/

O procedimento padrão do zip é adicionar os novos arquivos a um pacote preexistente. Além disto, ele verifica se os arquivos repetidos são mais novos do que os que já existem e, se for este o caso, sobrescreve os antigos, deixando o pacote atualizado.

Como atualizar arquivos dentro de um pacote zip

Em vez de criar um novo arquivo ou “enfiar” os arquivos de novo para dentro de um pacote já existente, que tal apenas atualizar os arquivos que sofreram alguma alteração?
A opção ‘-u’ (update) faz uma atualização do pacote, zipando apenas os itens que tenham sido alterados ou criados desde a última compactação.
A opção ‘-f’ faz a mesma coisa, só que não inclui novos arquivos.
Veja um exemplo:

zip -ur deeppurple.zip ~/music/ACDC/

Como listar os arquivos contidos ou ver informações sobre um pacote zip

Basicamente, há duas boas formas de listar os arquivos contidos em um pacote zip.
Você pode usar o utilitário unzip para apenas dar uma olhada no conteúdo do pacote.
Se a quantidade de arquivos for muito grande, combine-o com o comando less, da seguinte forma:

unzip -l home_backup.zip | less

Archive:  home_backup.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
    23697  2015-02-23 16:50   home/justincase/14.10.3
   133850  2015-06-02 19:59   home/justincase/1977_Death Of A Ladies Man.png
  7828773  2015-06-02 19:59   home/justincase/Alexandra Leaving.MP3
      197  2015-05-14 19:45   home/justincase/alter.sql
      200  2014-09-20 12:34   home/justincase/Boleto.html.zip.xml
  8762376  2015-06-02 19:59   home/justincase/Boogie Street.MP3
:

ou você pode usar apenas o comando less, para obter informações sobre o conteúdo do pacote zip:

less deeppurple.zip | less

Archive:  deeppurple.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
 6460104  Defl:N  6436345   0% 2015-08-17 17:02 304d865a  deep_purple/Deep Purple - Fireball - 01 - Fireball.mp3
13093116  Defl:N 13048773   0% 2015-08-17 17:02 9ee3fbb1  deep_purple/Deep Purple - Fireball - 02 - No No No.mp3
10093841  Defl:N 10045979   1% 2015-08-17 17:02 4b64f2fe  deep_purple/Deep Purple - Fireball - 03 - Demon´s Eye.mp3
 9166807  Defl:N  9099519   1% 2015-08-17 17:02 fe325f88  deep_purple/Deep Purple - Fireball - 04 - Anyone´s Daughter.mp3
10139816  Defl:N 10102938   0% 2015-08-17 17:02 00f38b4f  deep_purple/Deep Purple - Fireball - 05 - The Mule.mp3
15725423  Defl:N 15650648   1% 2015-08-17 17:02 3e00bcea  deep_purple/Deep Purple - Fireball - 06 - Fools.mp3
12167754  Defl:N 12119760   0% 2015-08-17 17:02 ccafa0ae  deep_purple/Deep Purple - Fireball - 07 - No One Came.mp3
  186339  Defl:N   185741   0% 2015-08-17 17:02 fee2ec5c  deep_purple/Deep_Purple_-_Fireball-back.jpg
  131164  Defl:N   131036   0% 2015-08-17 17:02 2e5d90a0  deep_purple/Deep_Purple_-_Fireball-cd.jpg
  109795  Defl:N   109165   1% 2015-08-17 17:02 bbf86a4f  deep_purple/Deep_Purple_-_Fireball-front.jpg
:

Como você pode perceber, acima, o comando mostra uma série de informações, além dos nomes dos arquivos empacotados.
Usuários mais avançados podem obter informações detalhadas sobre a situação de seus arquivos dentro de um pacote zip, com o utilitário zipdetails.
Veja como:

zipdetails deeppurple.zip | less

O aplicativo zipdetails, desenvolvido por Paul Marquess, exibe as informações da estrutura interna do pacote zip, em 3 colunas.

  • A primeira coluna expõe o offset a partir do começo do arquivo em hex
  • A segunda contém uma descrição textual do campo
  • Informações sobre os nomes dos arquivos, data de criação/empacotamento, taxa de compressão etc. podem ser observadas na terceira coluna

zipdetails-screen-capture-001

Como verificar a integridade de um arquivo zip

Verificar se o seu backup é íntegro e poderá ser restaurado posteriormente, em caso de necessidade (bate 3 vezes na madeira…) é tão importante quanto a própria prática de criar cópias de segurança.
Se vocẽ está compactando pastas e arquivos que têm pouco uso, para criar espaço adicional, é interessante verificar se o pacote zip está em perfeitas condições, antes de apagar os arquivos originais.
Use a opção ‘-T’ para testar o seus pacotes zip:

zip -T deeppurple.zip

Acrescente a opção ‘-v’ para obter mais verbosidade no processo:

zip -Tv deeppurple.zip

Em caso de erro no arquivo, a mensagem exibida pode ser semelhante a
zip error: Zip file structure invalid (deeppurple_defect.zip).

Como recuperar um pacote zip defeituoso

Alguns defeitos no arquivo zip podem ser corrigidos com a opção ‘-F’ (fixing).
Indique o arquivo defeituoso e o nome do novo arquivo corrigido, a ser criado:

zip -F deeppurple-defeituoso.zip --out deeppurple-corrigido.zip

O saída do programa, durante o procedimento de recuperação é semelhante a que segue:

Fix archive (-F) - assume mostly intact archive
Zip entry offsets appear off by -2 bytes - correcting...
 copying: deep_purple/Deep Purple - Fireball - 01 - Fireball.mp3
	zip warning: reading archive fseek: Invalid argument
	zip warning: bad - skipping: deep_purple/Deep Purple - Fireball - 01 - Fireball.mp3
 copying: deep_purple/Deep Purple - Fireball - 02 - No No No.mp3
 copying: deep_purple/Deep Purple - Fireball - 03 - Demon´s Eye.mp3

 ...

O processo poderá excluir um ou mais arquivos de dentro do pacote, que possam estar irremediavelmente corrompidos.
A documentação oficial do zip informa que a opção ‘-F’ pode ser usada quando porções do arquivo, como um todo, estão faltando.
Durante o procedimento, o arquivo defeituoso é vasculhado e o zip ignora alguns problemas, copiando para dentro do novo arquivo apenas o que estiver bom.
Se você usar a opção ‘-FF’, o arquivo será sondado com mais rigor. Esta opção pode ser usada em casos de danos muito graves.
Em casos de danos leves, a opção ‘-F’ é a mais confiável.

Como excluir arquivos do empacotamento

Há casos em que se deseja fazer um backup apenas dos arquivos texto do libreOffice (ODT) ou, caso você tenha baixado os arquivos do smartphone, fazer cópia de segurança das fotos em um arquivo e dos vídeos em outro.
Para isto, é possível indicar os arquivos indesejados, para que não sejam incluídos no pacote final.
Use a opção ‘-x’ para isto:

zip minhasfotos.zip -r media/ -x *.mp4 *.3gp 

Como especificar o método e o nível de compressão a ser usado

As versões atuais do utilitário suportam 3 métodos de armazenamento:

  • store — armazenamento simples, sem qualquer compressão. Esta opção não oferece qualquer ganho em economia de espaço, mas é a mais rápida.
    Equivale a usar a opção de compressão ‘-0’.
  • deflate — este o método de armazenamento padrão do utilitário. O zip analisa os arquivos e determina quando é mais adequado deflacionar ou armazenar do jeito que está.
  • bzip2 — o método bzip permite níveis de compactação superiores. Versões mais antigas do zip não suportam este método — tenha cuidado, portanto, caso você tenha a intenção de descompactar o pacote final em uma máquina com uma versão muito antiga do aplicativo. Faça os testes antes.

Veja um exemplo de uso da compactação com bzip2:

zip -Z bzip2 deeppurple.zip deep_purple/*

O nível de compressão (ou velocidade) de compressão pode ser definido por um número, na linha de comando.
Os níveis de compressão vão de 0 a 9 — quanto mais alto o nível de compressão, menor a velocidade do processo.
O nível padrão é ‘-6’.
O nível mais baixo é ‘-0’ (compressão nenhuma).
No exemplo abaixo, é usado o método bzip2, com a taxa máxima ‘-9’:

zip -vZ bzip2 -9 deeppurple.bz deep_purple/*
_

Faça testes e comparações, para encontrar o método e a taxa ideal para você.
Note que usei, acima, a extensão .bz — só para lembrar qual foi o método usado na compactação.
Como você pode ver, abaixo, a diferença entre um método e outro é pequena, quando se trata de arquivos já compactados — como é o caso de arquivos .mp3, .jpg etc.

ls -la deeppurple.*
-rw-r--r-- 1 justincase justincase 76899389 Ago 18 15:20 deeppurple.bz
-rw-r--r-- 1 justincase justincase 76932168 Ago 18 15:19 deeppurple.zip

Como remover arquivos de dentro do pacote zip

Você pode remover arquivos que julgue desnecessários de dentro de um pacote zip, com a opção ‘-d’.
O exemplo abaixo mostra como remover todos os arquivos .jpg de dentro do arquivo deeppurple.zip:

zip deeppurple.zip -d *.jpg
deleting: deep_purple/Deep_Purple_-_Fireball-back.jpg
deleting: deep_purple/Deep_Purple_-_Fireball-cd.jpg
deleting: deep_purple/Deep_Purple_-_Fireball-front.jpg
_

Como extrair arquivos

O aplicativo unzip, que faz parte do pacote do produto, é usado para reverter o processo de compactação.
O unzip também pode ser usado para testar e listar o conteúdo do pacote zip.
Se usado acompanhado apenas do nome do pacote, ele extrai todos os seus arquivos:

unzip deeppurple.zip

replace deep_purple/Deep Purple - Fireball - 01 - Fireball.mp3? [y]es, [n]o, [A]ll, [N]one, [r]ename:

Se você tiver compactado os arquivos, usando encriptação, sua senha será pedida.
No exemplo acima, o unzip detectou que alguns dos arquivos constantes do pacote, já existem dentro do diretório original e quer saber se deve substituir (reescrever) cada arquivo:

  • [y]es; — Sim, substitui o arquivo do diretório pelo do pacote.
  • [n]o; — Não substitui e passa para o próximo.
  • [A]ll; — Substitui todos os arquivos do diretório, pelos que se encontram no pacote.
  • [N]one; — Não substitui nada.
  • [r]ename; — Renomeia. Vai pedir um novo nome para o arquivo que se encontra repetido.

Como usar os recursos de encriptação do zip

Se você está armazenando arquivos sensíveis, deve pensar seriamente em usar a criptografia para protegê-los melhor de curiosos ou roubos de dados.
A opção ‘-e’ ou ‘–encrypt’, criptografa o conteúdo do arquivo zip, usando uma senha, que deve ser digitada na linha de comando — 2 vezes para confirmar.

zip -e deeppurple.zip deep_purple/*

A opção ‘-P’ ou ‘–password’ também pode ser usada, mas é muito insegura — uma vez que deve ser dada junto com a senha na linha de comando. Desta maneira, qualquer pessoa, por trás de você, pode ver a senha digitada, além do fato de que o comando inteiro vai ficar armazenado no seu histórico.
É possível quebrar a criptografia de arquivos zipados (de vários formatos e tipos) com o uso de softwares apropriados.
Isto pode ser uma boa notícia. Caso você esqueça a senha de um pacote encriptado, pode ser útil saber como quebrar a segurança para ter acesso aos seus arquivos.
O artigo Como quebrar senhas de arquivos rar, 7z, zip etc explica como furar a segurança de arquivos compactados.
Atualmente, a maneira mais segura e acessível de criptografar seus arquivos é usando o GPG. Leia o artigo Como encriptar arquivos com o gpg, para saber como ficar do lado mais seguro.

Publicado por

Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia.
Fã de séries, como “Rick and Morty” e “BoJack Horseman”.
Me siga no Twitter e vamos trocar ideias!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *