Blog DLN Cloud

Exemplos do comando zip e unzip no linux

Aprenda a usar o comando zip para comprimir arquivos e unzip para descomprimir com exemplos práticos

Neste tutorial, compartilharei vários exemplos de como usar o comando zip no Linux para comprimir arquivos, pastas com arquivos dentro, tudo sendo armazenado em um ou em vários arquivos zip.

O Comando zip usa o formato de compressão também chamado de zip, é um comando disponível nos repositórios da maioria das distribuições linux.

Instalação dos comandos zip e unzip

Na distribuições linux Debian e Ubuntu podemos instalar o comando zip e unzip autenticado com a conta de usuário root usando o seguinte comando:

apt install zip unzip -y

Nas distribuições linux Fedora ou Red hat Enterprise Linux usamos o comando também com o usuário root:

yum install zip unzip -y

Comprimir um único arquivo no Linux

Neste primeiro exemplo do comando zip, você aprenderá como comprimir um arquivo, para este exemplo vou usar o arquivo /etc/services. o arquivo no momento tem 15k:

dlncloud@server:~$ ls -lh /etc/services 
-rw-r--r-- 1 root root 15K Feb 16  2020 /etc/services

Para comprimir o arquivo usamos o comando zip seguido do novo nome(fica a seu critério o nome que vai ser dado) e em seguida a localização do arquivo:

dlncloud@server:~$ zip services /etc/services 
  adding: etc/services (deflated 59%)
dlncloud@server:~$ ls -lh services.zip 
-rw-rw-r-- 1 dlncloud dlncloud 6.0K Feb  2 00:31 services.zip

O Resultado é que a cópia do arquivo original comprimida teve 59% de compressão do seu tamanho original, de 15K agora tem 6k.

Comprimir todos arquivos que não são ocultos de um diretório

Para o próximo exemplo iremos comprimir os arquivos do diretório /boot(não está incluso os arquivos dos subdiretórios), que contém versões do kernel linux do sistema, o arquivo initramfs e outros arquivos:

dlncloud@server:~$ ls -lh /boot/
total 197M
-rw-r--r-- 1 root root 233K Jan  6 21:56 config-5.4.0-94-generic
-rw-r--r-- 1 root root 233K Jan 12 15:16 config-5.4.0-96-generic
drwxr-xr-x 4 root root 4.0K Jan 21 21:08 grub
lrwxrwxrwx 1 root root   27 Jan 21 21:08 initrd.img -> initrd.img-5.4.0-96-generic
-rw-r--r-- 1 root root  81M Jan 17 21:46 initrd.img-5.4.0-94-generic
-rw-r--r-- 1 root root  81M Jan 21 21:08 initrd.img-5.4.0-96-generic
lrwxrwxrwx 1 root root   27 Jan 17 21:45 initrd.img.old -> initrd.img-5.4.0-94-generic
drwx------ 2 root root  16K Jan 17 21:43 lost+found
-rw------- 1 root root 4.6M Jan  6 21:56 System.map-5.4.0-94-generic
-rw------- 1 root root 4.6M Jan 12 15:16 System.map-5.4.0-96-generic
lrwxrwxrwx 1 root root   24 Jan 21 21:08 vmlinuz -> vmlinuz-5.4.0-96-generic
-rw------- 1 root root  14M Jan  6 23:07 vmlinuz-5.4.0-94-generic
-rw------- 1 root root  14M Jan 12 16:22 vmlinuz-5.4.0-96-generic
lrwxrwxrwx 1 root root   24 Jan 17 21:45 vmlinuz.old -> vmlinuz-5.4.0-94-generic

Para comprimir cada arquivo do diretório usamos o comando o caractere “*” asterisco para indicar o nome de todos os arquivos:

dlncloud@server:~$ sudo zip boot-sistema /boot/*
[sudo] password for dlncloud: 
  adding: boot/config-5.4.0-94-generic (deflated 75%)
  adding: boot/config-5.4.0-96-generic (deflated 75%)
  adding: boot/grub/ (stored 0%)
  adding: boot/initrd.img (deflated 13%)
  adding: boot/initrd.img-5.4.0-94-generic (deflated 13%)
  adding: boot/initrd.img-5.4.0-96-generic (deflated 13%)
  adding: boot/initrd.img.old (deflated 13%)
  adding: boot/lost+found/ (stored 0%)
  adding: boot/System.map-5.4.0-94-generic (deflated 79%)
  adding: boot/System.map-5.4.0-96-generic (deflated 79%)
  adding: boot/vmlinuz (deflated 18%)
  adding: boot/vmlinuz-5.4.0-94-generic (deflated 18%)
  adding: boot/vmlinuz-5.4.0-96-generic (deflated 18%)
  adding: boot/vmlinuz.old (deflated 18%)

É visivel na saída do comando zip que a cópia de cada arquivo dentro /boot, sem incluir arquivos de subdiretórios, é reduzido um percentual consideravel.

Perceba que arquivo nomeado de boot-sistema.zip que contém uma cópia de todos os arquivos comprimidos tem um tamanho maior do que a soma de todos os arquivos dentro do diretório /boot:

dlncloud@server:~$ ls -lh boot-sistema.zip 
-rw-r--r-- 1 root root 324M Feb  2 00:46 boot-sistema.zip

Isso ocorre por conta dos links símbolicos, que faz o comando zip gerar cópias do mesmo arquivo duas vezes. para copiar os links sem copiar o conteúdo dos arquivos destino de cada link use a opção -y ou –symlinks:

dlncloud@server:~$ sudo zip boot-sistema /boot/* --symlinks
updating: boot/config-5.4.0-94-generic (deflated 75%)
updating: boot/config-5.4.0-96-generic (deflated 75%)
updating: boot/grub/ (stored 0%)
updating: boot/initrd.img (stored 0%)
updating: boot/initrd.img-5.4.0-94-generic (deflated 13%)
updating: boot/initrd.img-5.4.0-96-generic (deflated 13%)
updating: boot/initrd.img.old (stored 0%)
updating: boot/lost+found/ (stored 0%)
updating: boot/System.map-5.4.0-94-generic (deflated 79%)
updating: boot/System.map-5.4.0-96-generic (deflated 79%)
updating: boot/vmlinuz (stored 0%)
updating: boot/vmlinuz-5.4.0-94-generic (deflated 18%)
updating: boot/vmlinuz-5.4.0-96-generic (deflated 18%)
updating: boot/vmlinuz.old (stored 0%)

Dessa vez os links tiveram 0% do seu tamanho reduzido, e o resultado é que o arquivo boot-sistema.zip agora sim tem o tamanho menor do que a soma do tamanho total de cada arquivo dentro de /boot:

dlncloud@server:~$ ls -lh boot-sistema.zip 
-rw-r--r-- 1 root root 163M Feb  2 00:56 boot-sistema.zip

Como criar um arquivo zip excluindo alguns arquivos

Para comprimir todos os arquivos de um diretório, mas com exceção de alguns, ou seja, excluindo alguns arquivos da compressão usamos a opção -x ou --exclude. para exemplo vou comprimir todos os arquivos .deb do diretório /var/cache/apt/archives com exceção do pacote rar.

dlncloud@server:~$ ls -lh /var/cache/apt/archives/
total 2.0M
-rw-r----- 1 root root    0 Jan 16 09:49 lock
-rw-r--r-- 1 root root 350K Mar 22  2020 p7zip_16.02+dfsg-7build1_amd64.deb
-rw-r--r-- 1 root root 1.2M Mar 22  2020 p7zip-full_16.02+dfsg-7build1_amd64.deb
-rw-r--r-- 1 root root  44K Mar 22  2020 p7zip-rar_16.02-3build1_amd64.deb
drwx------ 2 _apt root 4.0K Feb  2 01:04 partial
-rw-r--r-- 1 root root 289K Mar 22  2020 rar_2%3a5.5.0-1build1_amd64.deb
-rw-r--r-- 1 root root 111K Mar 22  2020 unrar_1%3a5.6.6-2build1_amd64.deb

Nesse exemplo não vou incluir o arquivo rar_2%3a5.5.0-1build1_amd64.deb, o comando completo é:

dlncloud@server:~$ zip pacotes /var/cache/apt/archives/*.deb --exclude /var/cache/apt/archives/rar*.deb
  adding: var/cache/apt/archives/p7zip_16.02+dfsg-7build1_amd64.deb (deflated 2%)
  adding: var/cache/apt/archives/p7zip-full_16.02+dfsg-7build1_amd64.deb (deflated 7%)
  adding: var/cache/apt/archives/p7zip-rar_16.02-3build1_amd64.deb (deflated 2%)
  adding: var/cache/apt/archives/unrar_1%3a5.6.6-2build1_amd64.deb (deflated 3%)

Na saída do comando você pode ver que o arquivo rar_2%3a5.5.0-1build1_amd64.deb não foi copiado e comprimido junto aos outros arquivos com extensão .deb.

Listando conteúdo do arquivo zip sem extrair o seu conteúdo

Você também pode listar o conteúdo do arquivo zip sem descomprimi usando a opção -sf ou –show-files. Por exemplo, você precisa verificar se realmente um arquivo não existe no arquivo .zip gerado, no exemplo anterior podemos verificar se o arquivo rar_2%3a5.5.0-1build1_amd64.deb realmente não foi incluso no arquivo pacotes.zip, sem precisar extrair seu conteúdo, o comando completo fica:

dlncloud@server:~$ zip --show-files pacotes.zip 
Archive contains:
  var/cache/apt/archives/p7zip_16.02+dfsg-7build1_amd64.deb
  var/cache/apt/archives/p7zip-full_16.02+dfsg-7build1_amd64.deb
  var/cache/apt/archives/p7zip-rar_16.02-3build1_amd64.deb
  var/cache/apt/archives/unrar_1%3a5.6.6-2build1_amd64.deb
Total 4 entries (1402784 bytes)

Você pode ver que além de exibir o conteúdo do arquivo zip na saída, realmente o arquivo rar não foi incluso, isso por que usamos a opção --exclude no exemplo anterior.

Comprimir arquivos sem armazenar o caminho completo

Por padrão, quando criamos um arquivo zip, ele armazena o caminho relativo da cópia do arquivo comprimido. Vamos pegar o exemplo do arquivo pacotes.zip gerado anteriormente:

dlncloud@server:~$ zip --show-files pacotes.zip 
Archive contains:
  var/cache/apt/archives/p7zip_16.02+dfsg-7build1_amd64.deb
  var/cache/apt/archives/p7zip-full_16.02+dfsg-7build1_amd64.deb
  var/cache/apt/archives/p7zip-rar_16.02-3build1_amd64.deb
  var/cache/apt/archives/unrar_1%3a5.6.6-2build1_amd64.deb
Total 4 entries (1402784 bytes)

Veja que os arquivos armazena o caminho relativo do ponto de onde o comando foi executado. se no momento da execução do comando zip estivesse no diretório /var/cache, o caminho relativo de cada arquivo seria apt/archives/nome_dos_pacotes.deb.

Portanto, para criar um arquivo zip no linux sem caminho do arquivo, ou seja, armazenar o arquivo sem incluir a localização do mesmo no arquivo zip, usamos a opção -j ou --junk-paths. Isso criará um arquivo zip sem caminho relativo dos arquivos e armazenará apenas o nome do arquivo e não armazenará nomes de diretório. Por exemplo:

dlncloud@server:~$ zip pacotes2 /var/cache/apt/archives/*.deb --exclude /var/cache/apt/archives/rar*.deb --junk-paths
  adding: p7zip_16.02+dfsg-7build1_amd64.deb (deflated 2%)
  adding: p7zip-full_16.02+dfsg-7build1_amd64.deb (deflated 7%)
  adding: p7zip-rar_16.02-3build1_amd64.deb (deflated 2%)
  adding: unrar_1%3a5.6.6-2build1_amd64.deb (deflated 3%)

A saída do comando já mostra que foi incluso somente os arquivos e o nome de cada arquivo sem incluir a localização com os nomes dos diretórios, podemos ver isso com a opção –show-files também:

dlncloud@server:~$ zip --show-files pacotes2.zip 
Archive contains:
  p7zip_16.02+dfsg-7build1_amd64.deb
  p7zip-full_16.02+dfsg-7build1_amd64.deb
  p7zip-rar_16.02-3build1_amd64.deb
  unrar_1%3a5.6.6-2build1_amd64.deb
Total 4 entries (1402784 bytes)

Comprimir todos os arquivos e subdiretórios de um diretório no Linux

Por padrão, o comando zip apenas irá comprimir arquivos. se você tentar comprimir o diretório, vai ter o resultado que já foi visto no primeiro exemplo desse tutorial, algo como:

dlncloud@server:~$ zip boot-grub /boot/grub
  adding: boot/grub/ (stored 0%)

Como você vê, o conteúdo armazenado era 0%(mas acredite tem conteúdo lá dentro de /boot/grub). Então, como comprimir um diretório ?

Use a opção -r ou --recurse-paths para comprimir um diretório e sua estrutura de diretórios (subdiretórios) recursivamente, vou usar a opção –symlinks também no exemplo abaixo para evitar duplicidade de conteúdo de arquivos com o comando zip:

dlncloud@server:~$ sudo zip --recurse-paths tudo-do-boot /boot --symlinks
  adding: boot/ (stored 0%)
  adding: boot/System.map-5.4.0-94-generic (deflated 79%)
  adding: boot/vmlinuz.old (stored 0%)
  adding: boot/config-5.4.0-96-generic (deflated 75%)
  adding: boot/initrd.img-5.4.0-96-generic (deflated 13%)
  adding: boot/initrd.img-5.4.0-94-generic (deflated 13%)
  adding: boot/vmlinuz-5.4.0-94-generic (deflated 18%)
  adding: boot/System.map-5.4.0-96-generic (deflated 79%)
  adding: boot/vmlinuz-5.4.0-96-generic (deflated 18%)
  adding: boot/initrd.img.old (stored 0%)
  adding: boot/grub/ (stored 0%)
  adding: boot/grub/grub.cfg (deflated 78%)
  adding: boot/grub/gfxblacklist.txt (deflated 36%)
  adding: boot/grub/i386-pc/ (stored 0%)
  adding: boot/grub/i386-pc/cmosdump.mod (deflated 53%)
  adding: boot/grub/i386-pc/vbe.mod (deflated 55%)
  adding: boot/grub/i386-pc/minix2_be.mod (deflated 43%)
  adding: boot/grub/i386-pc/gcry_crc.mod (deflated 17%)
  adding: boot/grub/i386-pc/gcry_dsa.mod (deflated 55%)
  adding: boot/grub/i386-pc/boot.mod (deflated 53%)
  adding: boot/grub/i386-pc/xnu.mod (deflated 53%)
  adding: boot/grub/i386-pc/gcry_sha512.mod (deflated 54%)
  adding: boot/grub/i386-pc/bitmap_scale.mod (deflated 44%)
  adding: boot/grub/i386-pc/regexp.mod (deflated 42%)
  adding: boot/grub/i386-pc/syslinuxcfg.mod (deflated 53%)
  adding: boot/grub/i386-pc/lvm.mod (deflated 51%)
.....
.....
.....
  adding: boot/grub/grubenv (deflated 97%)
  adding: boot/grub/fonts/ (stored 0%)
  adding: boot/grub/fonts/unicode.pf2 (deflated 53%)
  adding: boot/grub/unicode.pf2 (deflated 53%)
  adding: boot/config-5.4.0-94-generic (deflated 75%)
  adding: boot/vmlinuz (stored 0%)
  adding: boot/lost+found/ (stored 0%)
  adding: boot/initrd.img (stored 0%)

Como a saída é longa adicionei acima alguns pontinhos que não fazem parte da saída do comando, isso para sinalizar que tem mais conteúdo e que a saída acima foi resumida. mas veja que dessa vez os subdiretórios e os arquivos dentro de cada subdiretório foi incluso na compressão.

Exibindo a contagem de arquivos durante a compressão

Podemos usar a opção -dc ou --display-counts para exibir a contagem de entradas, ou seja, a contagem de arquivos que estão sendo inclusos no arquivo zip durante a execução do comando zip. Confira abaixo o exemplo de comando zip:

dlncloud@server:~$ zip -dc arquivos-etc /etc/services /etc/hosts /etc/nsswitch.conf
  0/  3   adding: etc/services (deflated 59%)
  1/  2   adding: etc/hosts (deflated 34%)
  2/  1   adding: etc/nsswitch.conf (deflated 50%)

O Aquivo arquivos-etc.zip foi gerado com uma cópia dos arquivos /etc/hosts, /etc/services e /etc/nsswitch.conf:

dlncloud@server:~$ zip --show-files arquivos-etc.zip 
Archive contains:
  etc/services
  etc/hosts
  etc/nsswitch.conf
Total 3 entries (15195 bytes)

Comprimir arquivos com proteção por senha

Você pode comprimir os arquivos de um diretório e também proteger com senha o arquivo zip usando a opção -e ou --encrypt. Com este argumento você cria um arquivo zip com uma senha criptografada. para esse exemplo vou comprimir os arquivo /etc/hosts, /etc/nsswtich.conf e /etc/services novamente com o comando zip:

dlncloud@server:~$ zip --encrypt arquivos-etc-encrypt /etc/services /etc/hosts /etc/nsswitch.conf
Enter password: 
Verify password: 
  adding: etc/services (deflated 59%)
  adding: etc/hosts (deflated 34%)
  adding: etc/nsswitch.conf (deflated 50%)

Para descomprimir podemos usar o comando unzip e logo em seguida o comando vai exigir a senha, mas iremos exemplificar mais a frente como descomprimir arquivos incluindo protegidos com senha.

Adicionar novos arquivos ao arquivo zip existente

Como adicionar arquivos ao arquivo zip existente, em vez de criar um novo arquivo zip ? 

AVISO:

Se essa operação falhar, o comando zip tentará restaurar o arquivo ao seu estado original. Se a restauração falhar, o arquivo pode ficar corrompido. Esta opção é ignorada quando não há arquivo existente ou quando pelo menos um membro do arquivo zip deve ser atualizado ou excluído.

Foi gerado em um exemplo anterior o arquivo arquivos-etc.zip, vou usar esse mesmo arquivo para esse exemplo e vou adicionar o arquivo /etc/login.defs dentro do arquivo zip arquivos-etc.zip.

dlncloud@server:~$ zip --show-files arquivos-etc.zip 
Archive contains:
  etc/services
  etc/hosts
  etc/nsswitch.conf
Total 3 entries (15195 bytes)

Para isso vamos usar a opção -g ou –grow do comando zip, para adicionar novos arquivos dentro do arquivo .zip:

dlncloud@server:~$ zip arquivos-etc.zip --grow /etc/login.defs 
  adding: etc/login.defs (deflated 58%)

O arquivo /etc/login.defs foi adicionado ao arquivo zip existente, veja:

dlncloud@server:~$ zip --show-files arquivos-etc.zip 
Archive contains:
  etc/services
  etc/hosts
  etc/nsswitch.conf
  etc/login.defs
Total 4 entries (25745 bytes)

Removendo arquivos dentro do arquivo zip

É Possível também excluir arquivos que estão dentro do arquivo zip usando a opção -d ou --delete. para esse exemplo vou usar novamente o arquivo “arquivos-etc.zip“, abaixo é exibido o conteúdo atual do arquivo zip:

Archive contains:
  etc/services
  etc/hosts
  etc/nsswitch.conf
  etc/login.defs
Total 4 entries (25745 bytes)

Vou remover o arquivo /etc/nsswitch.conf de dentro do arquivo arquivos-etc.zip, o comando completo é:

dlncloud@server:~$ zip --delete arquivos-etc.zip /etc/nsswitch.conf
deleting: etc/nsswitch.conf

Você deve se atentar a localização completa do arquivo que quer remover, note que o arquivo nsswitch.conf tem a localização etc/nsswitch.conf dentro do arquivo zip, precisei incluir a localização completa “/etc/nsswitch.conf”, agora veja o que tem no arquivo zip:

dlncloud@server:~$ zip --show-files arquivos-etc.zip 
Archive contains:
  etc/services
  etc/hosts
  etc/login.defs
Total 3 entries (25235 bytes)

Descomprimir arquivo zip usando o comando unzip

Depois de mostrar vários exemplos de como comprimir arquivos e diretórios com conteúdos, vou demonstrar como descomprimir um arquivo zip. Para descomprimir um arquivo. zip usamos o comando unzip.

Uma informação importante antes de demonstrar o uso do comando unzip, é que o comando unzip por padrão ele descomprime o conteúdo do arquivo zip no diretório corrente. Nesse exemplo vou descomprimir o arquivo boot-sistema.zip, a sintaxe é unzip seguido da localização do arquivo:

dlncloud@server:~$ unzip boot-sistema.zip 
Archive:  boot-sistema.zip
  inflating: boot/config-5.4.0-94-generic  
  inflating: boot/config-5.4.0-96-generic  
   creating: boot/grub/
    linking: boot/initrd.img         -> initrd.img-5.4.0-96-generic 
  inflating: boot/initrd.img-5.4.0-94-generic  
  inflating: boot/initrd.img-5.4.0-96-generic  
    linking: boot/initrd.img.old     -> initrd.img-5.4.0-94-generic 
   creating: boot/lost+found/
  inflating: boot/System.map-5.4.0-94-generic  
  inflating: boot/System.map-5.4.0-96-generic  
    linking: boot/vmlinuz            -> vmlinuz-5.4.0-96-generic 
  inflating: boot/vmlinuz-5.4.0-94-generic  
  inflating: boot/vmlinuz-5.4.0-96-generic  
    linking: boot/vmlinuz.old        -> vmlinuz-5.4.0-94-generic 
finishing deferred symbolic links:
  boot/initrd.img        -> initrd.img-5.4.0-96-generic
  boot/initrd.img.old    -> initrd.img-5.4.0-94-generic
  boot/vmlinuz           -> vmlinuz-5.4.0-96-generic
  boot/vmlinuz.old       -> vmlinuz-5.4.0-94-generic

Depois de descomprimir veja que estou no diretório /home/dlncloud e que o diretório boot está dentro e não foi restaurado para /boot:

dlncloud@server:~$ pwd
/home/dlncloud
dlncloud@server:~$ ls -lh /home/dlncloud
total 332M
-rw-rw-r-- 1 dlncloud dlncloud 6.7K Feb  2 02:49 arquivos-etc-encrypt.zip
-rw-rw-r-- 1 dlncloud dlncloud  11K Feb  2 03:16 arquivos-etc.zip
drwxrwxr-x 4 dlncloud dlncloud 4.0K Feb  2 05:20 boot
-rw-rw-r-- 1 dlncloud dlncloud  170 Feb  2 01:59 boot-grub.zip
-rw-r--r-- 1 root     root     163M Feb  2 00:56 boot-sistema.zip
-rw-rw-r-- 1 dlncloud dlncloud  305 Feb  2 01:39 hosts.zip
-rw-rw-r-- 1 dlncloud dlncloud 1.7M Feb  2 01:52 pacotes2.zip
-rw-rw-r-- 1 dlncloud dlncloud 1.7M Feb  2 01:52 pacotes.zip
-rw-rw-r-- 1 dlncloud dlncloud 6.0K Feb  2 00:31 services.zip
-rw-r--r-- 1 root     root     166M Feb  2 02:05 tudo-do-boot.zip
dlncloud@server:~$ ls -lh /home/dlncloud/boot
total 197M
-rw-r--r-- 1 dlncloud dlncloud 233K Jan  6 21:56 config-5.4.0-94-generic
-rw-r--r-- 1 dlncloud dlncloud 233K Jan 12 15:16 config-5.4.0-96-generic
drwxr-xr-x 2 dlncloud dlncloud 4.0K Jan 21 21:08 grub
lrwxrwxrwx 1 dlncloud dlncloud   27 Feb  2 05:20 initrd.img -> initrd.img-5.4.0-96-generic
-rw-r--r-- 1 dlncloud dlncloud  81M Jan 17 21:46 initrd.img-5.4.0-94-generic
-rw-r--r-- 1 dlncloud dlncloud  81M Jan 21 21:08 initrd.img-5.4.0-96-generic
lrwxrwxrwx 1 dlncloud dlncloud   27 Feb  2 05:20 initrd.img.old -> initrd.img-5.4.0-94-generic
drwx------ 2 dlncloud dlncloud 4.0K Jan 17 21:43 lost+found
-rw------- 1 dlncloud dlncloud 4.6M Jan  6 21:56 System.map-5.4.0-94-generic
-rw------- 1 dlncloud dlncloud 4.6M Jan 12 15:16 System.map-5.4.0-96-generic
lrwxrwxrwx 1 dlncloud dlncloud   24 Feb  2 05:20 vmlinuz -> vmlinuz-5.4.0-96-generic
-rw------- 1 dlncloud dlncloud  14M Jan  6 23:07 vmlinuz-5.4.0-94-generic
-rw------- 1 dlncloud dlncloud  14M Jan 12 16:22 vmlinuz-5.4.0-96-generic
lrwxrwxrwx 1 dlncloud dlncloud   24 Feb  2 05:20 vmlinuz.old -> vmlinuz-5.4.0-94-generic

Nesse exemplo para descomprimir o conteúdo do arquivo para seu local de origem que é /boot usamos o comando unzip com a opção -d para indicar a localização exata do local onde vai ser extraído o conteúdo do arquivo zip, nesse caso para o diretório /, já que o diretório boot é um subdiretório de /:

dlncloud@server:~$ sudo unzip boot-sistema.zip -d /
[sudo] password for dlncloud: 
Archive:  boot-sistema.zip
replace /boot/config-5.4.0-94-generic? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
  inflating: /boot/config-5.4.0-94-generic  
  inflating: /boot/config-5.4.0-96-generic  
    linking: /boot/initrd.img        -> initrd.img-5.4.0-96-generic 
  inflating: /boot/initrd.img-5.4.0-94-generic  
  inflating: /boot/initrd.img-5.4.0-96-generic  
    linking: /boot/initrd.img.old    -> initrd.img-5.4.0-94-generic 
  inflating: /boot/System.map-5.4.0-94-generic  
  inflating: /boot/System.map-5.4.0-96-generic  
    linking: /boot/vmlinuz           -> vmlinuz-5.4.0-96-generic 
  inflating: /boot/vmlinuz-5.4.0-94-generic  
  inflating: /boot/vmlinuz-5.4.0-96-generic  
    linking: /boot/vmlinuz.old       -> vmlinuz-5.4.0-94-generic 
finishing deferred symbolic links:
  /boot/initrd.img       -> initrd.img-5.4.0-96-generic
  /boot/initrd.img.old   -> initrd.img-5.4.0-94-generic
  /boot/vmlinuz          -> vmlinuz-5.4.0-96-generic
  /boot/vmlinuz.old      -> vmlinuz-5.4.0-94-generic

Como os arquivos já existem no destino, o comando unzip pergunta se deseja substituir o arquivos de destino pelo arquivo que está dentro do arquivo zip abrindo um prompt com as seguintes opções: [y]es, [n]o, [A]ll, [N]one, [r]ename nesse caso respondi “A” de “All” para responder “yes” e substituir todos os arquivos de destino pelos arquivos dentro do zip que tem o mesmo nome.

dlncloud@server:~$ ls -lh /boot
total 197M
-rw-r--r-- 1 root root 233K Jan  6 21:56 config-5.4.0-94-generic
-rw-r--r-- 1 root root 233K Jan 12 15:16 config-5.4.0-96-generic
drwxr-xr-x 4 root root 4.0K Jan 21 21:08 grub
lrwxrwxrwx 1 root root   27 Feb  2 05:25 initrd.img -> initrd.img-5.4.0-96-generic
-rw-r--r-- 1 root root  81M Jan 17 21:46 initrd.img-5.4.0-94-generic
-rw-r--r-- 1 root root  81M Jan 21 21:08 initrd.img-5.4.0-96-generic
lrwxrwxrwx 1 root root   27 Feb  2 05:25 initrd.img.old -> initrd.img-5.4.0-94-generic
drwx------ 2 root root  16K Jan 17 21:43 lost+found
-rw------- 1 root root 4.6M Jan  6 21:56 System.map-5.4.0-94-generic
-rw------- 1 root root 4.6M Jan 12 15:16 System.map-5.4.0-96-generic
lrwxrwxrwx 1 root root   24 Feb  2 05:25 vmlinuz -> vmlinuz-5.4.0-96-generic
-rw------- 1 root root  14M Jan  6 23:07 vmlinuz-5.4.0-94-generic
-rw------- 1 root root  14M Jan 12 16:22 vmlinuz-5.4.0-96-generic
lrwxrwxrwx 1 root root   24 Feb  2 05:25 vmlinuz.old -> vmlinuz-5.4.0-94-generic

Para descomprimir um arquivo criptografado pelo comando zip, usamos somente o comando unzip seguido do nome do arquivos e quando solicitado digitamos a senha:

dlncloud@server:~$ unzip arquivos-etc-encrypt.zip 
Archive:  arquivos-etc-encrypt.zip
[arquivos-etc-encrypt.zip] etc/services password: 
  inflating: etc/services            
  inflating: etc/hosts               
  inflating: etc/nsswitch.conf 

Como comprimir um diretório e depois dividir o arquivo zip

O último exemplo é usar o comando zip para comprimir um ou mais arquivos, gerando uma cópia deles no arquivo zip e dividir o arquivo zip à medida que é criado, se o tamanho do arquivo atingir o tamanho da divisão especificada, essa divisão será fechada e a próxima divisão será aberta.

IMPORTANTE:

O Tamanho da divisão é um número opcionalmente seguido por um multiplicador. Atualmente, o multiplicador pode ser um de k para kilobytesm para megabytesg para gigabytes ou t para terabytes. Como 64k é o tamanho mínimo de divisão, os números sem multiplicadores são padronizados para megabytes

Para esse exemplo do comando zip vamos criar um arquivo zip com uma cópia do diretório /lib/modules/$(uname -r), onde o código $(uname -r) vai ser substituído pela versão do kernel linux que está em uso no sistema. Para criar um arquivo zip dividido usamos a opção -s ou –split-size, vamos dividir o arquivo zip a cada 25 megabytes gravados.

Vamos também usar a opção -q para suprimir as informações mostradas na tela, já que a quantidade de arquivos no diretório com módulos do kernel é muito grande. o comando completo fica assim:

dlncloud@server:~$ sudo zip -q -r --split-size 25m kernel-linux /lib/modules/$(uname -r) --symlinks
dlncloud@server:~$ ls -lh kernel-linux.*
-rw-r--r-- 1 root root  25M Feb  2 19:28 kernel-linux.z01
-rw-r--r-- 1 root root  25M Feb  2 19:28 kernel-linux.z02
-rw-r--r-- 1 root root  25M Feb  2 19:28 kernel-linux.z03
-rw-r--r-- 1 root root 3.9M Feb  2 19:28 kernel-linux.zip

Você pode ver que o arquivo é dividido em várias partes e cada parte ganha uma númeração, com exceção da ultima parte que somente tem a extensão .zip.

Mas a pergunta que fica é: tá eu comprimi e dividi o arquivo em várias partes e seu quiser descomprimir para ter novamente os arquivos como faço isso ?

A resposta é junte todos eles novamente e em seguida descomprima. para juntar todos os arquivo usamos a opção -s novamente com valor 0 (zero) e a opção –out, essa nova opção –out indica a localização do novo arquivos zip que contém todas as partes dos outros arquivos .zip.

Para juntar o arquivo kernel-linux.z* gerado anteriormente, o novo arquivo zip deve ter um nome diferente, o comando fica:

dlncloud@server:~$ zip -q -s 0 kernel-linux.zip --out kernel-linux-completo.zip
dlncloud@server:~$ ls -lh kernel-linux*
-rw-rw-r-- 1 dlncloud dlncloud  79M Feb  2 19:39 kernel-linux-completo.zip
-rw-r--r-- 1 root     root      25M Feb  2 19:28 kernel-linux.z01
-rw-r--r-- 1 root     root      25M Feb  2 19:28 kernel-linux.z02
-rw-r--r-- 1 root     root      25M Feb  2 19:28 kernel-linux.z03
-rw-r--r-- 1 root     root     3.9M Feb  2 19:28 kernel-linux.zip

E agora para descomprimir use o comando unzip, usamos a opção -q para não exibir os arquivos e diretórios que estão sendo extraídos:

dlncloud@server:~$ unzip -q kernel-linux-completo.zip
dlncloud@server:~$ ls -lhd /home/dlncloud/lib
drwxrwxr-x 3 dlncloud dlncloud 4.0K Feb  2 19:44 /home/dlncloud/lib
dlncloud@server:~$ ls -lh /home/dlncloud/lib
total 4.0K
drwxrwxr-x 3 dlncloud dlncloud 4.0K Feb  2 19:44 modules
dlncloud@server:~$ ls -lh /home/dlncloud/lib/modules/
total 4.0K
drwxr-xr-x 5 dlncloud dlncloud 4.0K Jan 21 21:08 5.4.0-96-generic
dlncloud@server:~$ ls -lh /home/dlncloud/lib/modules/5.4.0-96-generic/
total 5.7M
lrwxrwxrwx  1 dlncloud dlncloud   39 Feb  2 19:44 build -> /usr/src/linux-headers-5.4.0-96-generic
drwxr-xr-x  2 dlncloud dlncloud 4.0K Jan 12 15:16 initrd
drwxr-xr-x 17 dlncloud dlncloud 4.0K Jan 21 21:07 kernel
-rw-r--r--  1 dlncloud dlncloud 1.4M Jan 21 21:08 modules.alias
-rw-r--r--  1 dlncloud dlncloud 1.4M Jan 21 21:08 modules.alias.bin
-rw-r--r--  1 dlncloud dlncloud 8.0K Jan 12 15:16 modules.builtin
-rw-r--r--  1 dlncloud dlncloud  25K Jan 21 21:08 modules.builtin.alias.bin
-rw-r--r--  1 dlncloud dlncloud  11K Jan 21 21:08 modules.builtin.bin
-rw-r--r--  1 dlncloud dlncloud  63K Jan 12 15:16 modules.builtin.modinfo
-rw-r--r--  1 dlncloud dlncloud 596K Jan 21 21:08 modules.dep
-rw-r--r--  1 dlncloud dlncloud 834K Jan 21 21:08 modules.dep.bin
-rw-r--r--  1 dlncloud dlncloud  330 Jan 21 21:08 modules.devname
-rw-r--r--  1 dlncloud dlncloud 215K Jan 12 15:16 modules.order
-rw-r--r--  1 dlncloud dlncloud  947 Jan 21 21:08 modules.softdep
-rw-r--r--  1 dlncloud dlncloud 601K Jan 21 21:08 modules.symbols
-rw-r--r--  1 dlncloud dlncloud 731K Jan 21 21:08 modules.symbols.bin
drwxr-xr-x  3 dlncloud dlncloud 4.0K Jan 21 21:07 vdso

Espero que os exemplos do tutorial tenha ajudado a entender como comprimir e descomprimir arquivos e diretórios usando o comando zip, e que os vários exemplos apresentados aqui possa abranger algumas necessídades que podem surgir usando o coman zip. É importante também mencionar que nem todos os tipos de arquivos vão ter seu tamanho reduzido ou muito reduzido.

Deixe um comentário

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