Domine o Terminal Linux: Crie e Extraia Arquivos ZIP com Estes Comandos

Os ficheiros ZIP são um formato de arquivo universal, frequentemente utilizado em sistemas como Windows, macOS e também Linux. É possível criar um ficheiro ZIP ou extrair o conteúdo de um, recorrendo a alguns comandos comuns no terminal Linux.

O Formato de Arquivo ZIP

Devido à sua popularidade no ambiente Windows, o formato ZIP é, provavelmente, o tipo de arquivo comprimido mais comum no mundo.

Embora os arquivos .tar.gz e tar.bz2 sejam comuns em sistemas Linux, os utilizadores de Windows tendem a enviar ficheiros no formato ZIP. Assim, se precisar compactar alguns ficheiros e enviá-los a um utilizador de Windows, o formato ZIP será a solução mais prática e com maior compatibilidade.

Ferramentas de Compressão, Descompressão e Outras Utilidades

Certamente já sabe que o Linux e sistemas operativos similares, como o macOS, possuem ferramentas que permitem criar ficheiros ZIP e extrair arquivos deles. Estas ferramentas são denominadas zip e unzip, respetivamente. Existe ainda um conjunto de utilitários relacionados, como o zipcloak, zipdetails, zipsplit e zipinfo.

Analisámos algumas distribuições Linux para verificar se estas ferramentas estavam incluídas na instalação padrão. Todos os utilitários estavam presentes no Ubuntu 19.04, 18.10 e 18.04. Também se encontravam presentes no Manjaro 18.04. O Fedora 29 incluía apenas o zip e o unzip, e o mesmo acontecia no CentOS.

Para instalar as ferramentas que faltam no Fedora 29, utilize o comando seguinte:

sudo dnf install perl-IO-Compress

Para instalar os elementos que faltam no CentOS 7, use o seguinte comando:

sudo yum install perl-IO-Compress

Se algum dos utilitários zip estiver em falta numa distribuição Linux não mencionada acima, utilize o gestor de pacotes dessa distribuição para instalar o pacote necessário.

Como Criar um Arquivo ZIP com o Comando zip

Para criar um arquivo ZIP, é necessário indicar ao comando zip o nome do arquivo comprimido e quais os arquivos a incluir. Não é obrigatório adicionar a extensão “.zip” ao nome do ficheiro, mas não causa qualquer problema caso o faça.

Para criar um ficheiro chamado source_code.zip contendo todos os ficheiros de código fonte C e ficheiros de cabeçalho no diretório atual, deve utilizar o seguinte comando:

zip source_code *.c *.h

Cada ficheiro é listado à medida que é adicionado. O nome do ficheiro e a quantidade de compressão alcançada nesse ficheiro são apresentados.

Ao verificar o novo arquivo ZIP, irá constatar que a extensão “.zip” foi adicionada automaticamente pelo comando zip.

ls -l source_code.zip

Caso não pretenda visualizar a saída do comando zip enquanto o ficheiro ZIP está a ser criado, utilize a opção -q (silencioso).

zip -q source_code *.c *.h

Incluindo Pastas em Ficheiros ZIP

Para incluir subpastas no ficheiro ZIP, utilize a opção -r (recursiva) e adicione o nome da subpasta na linha de comando. Para criar um ficheiro ZIP como anteriormente e também incluir a subpasta archive, use este comando.

zip -r -q source_code archive/ *.c *.h

Para facilitar a vida de quem irá extrair os arquivos do ficheiro ZIP que está a criar, é recomendável que os ficheiros dentro do ficheiro ZIP estejam contidos numa pasta. Desta forma, quando a pessoa que recebe o ficheiro ZIP o extrai, todos os arquivos são colocados organizadamente numa pasta no seu computador.

No comando seguinte, vamos compactar a pasta de trabalho e todas as suas subpastas. Note que este comando está a ser emitido a partir da pasta pai da pasta de trabalho.

zip -r -q source_code work/

Definir o Nível de Compressão

Pode definir o nível de compressão aplicado aos ficheiros à medida que estes são adicionados ao ficheiro ZIP. O intervalo varia entre 0 e 9, sendo que 0 representa nenhuma compressão. Quanto maior a compressão, mais tempo demora a criar o ficheiro ZIP. Para ficheiros ZIP de tamanho moderado, a diferença de tempo não é significativa. Para este tipo de ficheiros, a compressão padrão (nível 6) é normalmente suficiente.

Para indicar ao comando zip um nível específico de compressão, passe o número como uma opção na linha de comando, com um “-“, desta forma:

zip -0 -r -q source_code work/

O nível de compressão padrão é 6. Não é necessário indicar a opção -6, mas não causa qualquer problema se o fizer.

zip -r -q source_code work/

O nível máximo de compressão é o nível 9.

zip -9 -r -q source_code work/

Com a seleção de ficheiros e pastas sendo arquivados, a diferença entre nenhuma compressão (nível 0) e a compressão padrão (nível 6) é de 400K. A diferença entre a compressão padrão e o nível mais alto de compressão (nível 9) é de apenas 4K.

Isto pode não parecer muito, mas para ficheiros que contêm centenas ou milhares de arquivos, a pequena quantidade de compressão extra por ficheiro pode resultar numa poupança de espaço valiosa.

Adicionando Palavras-passe a Ficheiros ZIP

Adicionar palavras-passe a ficheiros ZIP é simples. Utilize a opção -e (encriptar) e ser-lhe-á solicitada a palavra-passe, que terá de ser inserida novamente para verificação.

zip -e -r -q source_code work/

Como Extrair um Ficheiro ZIP com o Comando unzip

Para extrair os ficheiros de um ficheiro ZIP, utilize o comando unzip e indique o nome do ficheiro ZIP. Note que é necessário indicar a extensão “.zip”.

unzip source_code.zip

À medida que os ficheiros são extraídos, estes são listados na janela do terminal.

Os ficheiros ZIP não contêm detalhes sobre a propriedade do ficheiro. Todos os arquivos extraídos ficam com o proprietário definido para o utilizador que está a executar a extração.

Tal como o comando zip, o comando unzip possui uma opção -q (silencioso), que permite não visualizar a lista de ficheiros à medida que estes são extraídos.

unzip -q source_code.zip

Extraindo Ficheiros para um Diretório de Destino

Para extrair os ficheiros para um diretório específico, use a opção -d (diretório) e indique o caminho para o diretório para onde pretende extrair o ficheiro.

unzip -q source_code.zip -d ./development

Extrair Ficheiros ZIP Protegidos por Palavra-passe

Se um ficheiro ZIP tiver sido criado com uma palavra-passe, o comando unzip irá solicitá-la. Caso não forneça a palavra-passe correta, a descompactação não irá extrair os arquivos.

unzip -q source_code.zip

Se não se importar que a sua palavra-passe seja vista por outras pessoas, ou que fique armazenada no histórico de comandos, pode indicar a palavra-passe na linha de comando com a opção -P (palavra-passe). (Deve usar um “P” maiúsculo)

unzip -P fifty.treacle.cutlass -q source_code.zip

Excluindo Ficheiros

Caso não pretenda extrair um determinado ficheiro ou grupo de ficheiros, utilize a opção -x (excluir). Neste exemplo, pretendemos extrair todos os arquivos, exceto aqueles que terminam com a extensão “.h”.

unzip -q source_code.zip -x *.h

Sobrescrever Ficheiros

Suponha que extraiu um ficheiro, mas eliminou alguns dos ficheiros extraídos por engano.

Uma solução rápida seria extrair os arquivos mais uma vez. No entanto, caso tente extrair o ficheiro ZIP na mesma pasta onde já o tinha feito, o comando unzip irá solicitar uma decisão sobre a substituição dos arquivos. Será necessário fornecer uma das seguintes respostas.

Para além da resposta r (renomear), estas respostas são sensíveis a maiúsculas e minúsculas.

y: Sim, sobrescrever este ficheiro
n: Não, não substituir este ficheiro
R: Tudo, sobrescrever todos os arquivos
N: Nenhum, não sobrescrever nenhum dos arquivos
r: Renomear, extrair este ficheiro, mas atribuir-lhe um novo nome. Ser-lhe-á solicitado um novo nome.

Para forçar o comando unzip a sobrescrever todos os ficheiros existentes, utilize a opção -o (sobrescrever).

unzip -o -q source_code.zip

A forma mais eficiente de substituir os ficheiros em falta seria extrair apenas os arquivos do ficheiro que não existem na pasta de destino. Para o fazer, utilize a opção -n (nunca sobrescrever).

unzip -n source_code.zip

Consultando o Interior de um Ficheiro ZIP

Por norma, é útil e instrutivo ver uma lista dos ficheiros dentro de um ficheiro ZIP antes de o extrair. Pode fazer isto com a opção -l (listar ficheiro). O resultado é direcionado para o comando less para tornar a saída mais fácil de ler.

unzip -l source_code.zip | less

O resultado apresenta as pastas e ficheiros dentro do ficheiro ZIP, o respetivo tamanho e a hora e data em que foram adicionados ao arquivo. Pressione “q” para sair do comando less.

Existem outras formas de consultar o conteúdo de um ficheiro ZIP que fornecem diferentes tipos de informação, como veremos a seguir.

Adicionar uma Palavra-passe com o Comando zipcloak

Se criou um ficheiro ZIP, mas se esqueceu de adicionar uma palavra-passe, o que pode fazer? Pode adicionar rapidamente uma palavra-passe ao ficheiro ZIP utilizando o comando zipcloak. Indique o nome do ficheiro ZIP na linha de comando. Ser-lhe-á pedida uma palavra-passe. Terá de verificar a palavra-passe, digitando-a uma segunda vez.

zipcloak source_code.zip

Visualizar Detalhes do Ficheiro com o Comando zipdetails

O comando zipdetails apresenta várias informações sobre o ficheiro ZIP. A melhor forma de lidar com a quantidade de informações fornecidas por este comando é direcioná-lo para o comando less.

zipdetails source_code.zip | less

Note que as informações incluem nomes de ficheiros, mesmo que o ficheiro ZIP esteja protegido por palavra-passe. Este tipo de informação é armazenado no ficheiro ZIP como metadados e não faz parte dos dados encriptados.

Pesquisar no Interior do Ficheiro com o Comando zipgrep

O comando zipgrep permite pesquisar nos arquivos dentro de um ficheiro ZIP. No exemplo seguinte, pretendemos saber quais os ficheiros dentro do ficheiro ZIP que contêm o texto “keyval.h”.

zipgrep keyval.h source_code.zip

Podemos ver que os arquivos slang.c e getval.c contêm a string “keyval.h”. Podemos também ver que existem duas cópias de cada um destes ficheiros em pastas diferentes no ficheiro ZIP.

Visualizar Informações com o Comando zipinfo

O comando zipinfo oferece outra forma de consultar o interior de um ficheiro ZIP. Tal como anteriormente, direcionamos a saída para o comando less.

zipinfo source_code.zip | less

Da esquerda para a direita, o resultado apresenta:

As permissões do ficheiro
A versão da ferramenta usada para criar o ficheiro ZIP
O tamanho do ficheiro original
Um descritor de ficheiro (descrito abaixo)
O método de compressão (deflação, neste caso)
A data e hora
O nome do ficheiro e qualquer pasta

O descritor de ficheiro é composto por dois caracteres. O primeiro caractere será um “t” ou um “b” para indicar um ficheiro de texto ou binário. Se for uma letra maiúscula, o ficheiro está encriptado. O segundo caractere pode ser um de quatro caracteres. Este caractere representa o tipo de metadados incluídos neste ficheiro: nenhum, um cabeçalho local estendido, um “campo extra”, ou ambos.

-: Se nenhum dos dois existir, o caractere será um hífen
l: se existir um cabeçalho local estendido, mas nenhum campo extra
x: se não existir cabeçalho local estendido, mas existir um campo extra
X: se existir um cabeçalho local estendido e um campo extra

Dividir o Ficheiro com o Comando zipsplit

Se precisar de enviar o ficheiro ZIP para outra pessoa, mas existirem restrições de tamanho ou problemas com a transmissão do ficheiro, pode utilizar o comando zipsplit para dividir o ficheiro ZIP original num conjunto de ficheiros ZIP mais pequenos.

A opção -n (tamanho) permite definir um tamanho máximo para cada um dos novos ficheiros ZIP. Neste exemplo, estamos a dividir o ficheiro source_code.zip. Não pretendemos que nenhum dos novos ficheiros ZIP seja maior que 100 KB (102400 bytes).

zipsplit -n 102400 source_code.zip

O tamanho que escolher não pode ser inferior ao tamanho de qualquer um dos arquivos no ficheiro ZIP.

Com estes comandos, pode criar os seus próprios ficheiros ZIP, descompactar ficheiros ZIP recebidos e executar várias outras operações sem sair do terminal Linux.