3.1 Lição 1
Certificate: |
Linux Essentials |
---|---|
Version: |
1.6 |
Topic: |
3 O poder da linha de comando |
Objective: |
3.1 Como comprimir arquivos com a linha de comando |
Lesson: |
1 of 1 |
Introdução
A compressão é usada para reduzir a quantidade de espaço que um conjunto específico de dados consome. Em geral, recorremos a ela para reduzir a quantidade de espaço necessária para armazenar um arquivo. Outro uso comum é reduzir a quantidade de dados enviados através de uma conexão de rede.
A compressão substitui os padrões repetitivos presentes nos dados. Imagine um romance. Algumas palavras são extremamente comuns, mas têm mais de um caractere, como a palavra “mas”. É possível reduzir bastante o tamanho do romance substituindo essas palavras comuns com vários caracteres por outras formadas por um único caractere - por exemplo, substituindo “mas” por uma letra grega que não é usada em nenhuma outra parte do texto. Os algoritmos de compressão de dados funcionam de maneira semelhante, mas mais complexa.
Há duas variedades de compressão: sem perda e com perda. Os arquivos comprimidos com um algoritmo sem perda podem ser descomprimidos em sua forma original. Já os dados comprimidos com um algoritmo com perda não podem ser recuperados. Os algoritmos com perda são frequentemente usados para imagens, vídeos e áudios em que a perda de qualidade é imperceptível para os seres humanos, irrelevante para o contexto, ou em que a economia de espaço e de taxa de transferência de rede compensam a perda.
Usamos ferramentas de empacotamento para agrupar arquivos e diretórios em um único arquivo. Alguns usos comuns são backups, empacotamento de código-fonte de software e retenção de dados.
O empacotamento e a compressão são comumente usados juntos. Algumas ferramentas de empacotamento também comprimem seu conteúdo por padrão. Outras trazem a opção de comprimir o conteúdo. Algumas ferramentas de empacotamento devem ser usadas em conjunto com ferramentas de compressão independentes, caso se deseje comprimir o conteúdo.
A ferramenta mais comum para empacotar arquivos em sistemas Linux é o tar
. A maioria das distribuições Linux é fornecida com a versão GNU do tar
, e por isso a usaremos nesta lição. O tar
, por si só, gerencia o empacotamento de arquivos, mas não os comprime.
Existem muitas ferramentas de compressão disponíveis no Linux. Dentre as sem perdas, encontramos comumente bzip2
, gzip
e xz
. As três estão presentes na maioria dos sistemas. Em sistemas antigos ou muito minimalistas, o xz
ou o bzip
talvez não estejam instalados. Se você se tornar um usuário regular do Linux, provavelmente vai encontrar arquivos comprimidos com todas as três. Elas usam algoritmos diferentes; portanto, um arquivo comprimido com uma ferramenta não pode ser descomprimido por outra. As ferramentas de compressão exigem uma escolha: se você deseja uma alta taxa de compressão, levará mais tempo para comprimir e descomprimir o arquivo. Isso ocorre porque uma compressão mais alta demanda mais trabalho para encontrar padrões mais complexos. Todas essas ferramentas comprimem dados, mas não podem criar pacotes contendo vários arquivos.
Ferramentas exclusivas para compressão não costumam estar disponíveis nos sistemas Windows. As ferramentas de empacotamento e compressão do Windows geralmente são agrupadas. Lembre-se disso caso possua sistemas Linux e Windows que precisam compartilhar arquivos.
Os sistemas Linux também trazem ferramentas para lidar com os arquivos .zip
, comumente usados no sistema Windows. Elas se chamam zip
e unzip
. Essas ferramentas não vêm instaladas por padrão em todos os sistemas; se você precisar delas, poderá ser necessário instalá-las. Felizmente, elas costumam estar presentes nos repositórios de pacotes das distribuições.
Ferramentas de compressão
A quantidade de espaço em disco economizada pela compressão de arquivos depende de alguns fatores: a natureza dos dados que estão sendo comprimidos, o algoritmo usado para comprimir os dados e o nível de compressão. Nem todos os algoritmos suportam níveis de compressão diferentes.
Vamos começar preparando alguns arquivos de teste para comprimir:
$ mkdir ~/linux_essentials-3.1 $ cd ~/linux_essentials-3.1 $ mkdir compression archiving $ cd compression $ cat /etc/* > bigfile 2> /dev/null
Agora, criamos três cópias desse arquivo:
$ cp bigfile bigfile2 $ cp bigfile bigfile3 $ cp bigfile bigfile4 $ ls -lh total 2.8M -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile2 -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile3 -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile4
Em seguida vamos comprimir os arquivos com cada uma das ferramentas de compressão mencionadas:
$ bzip2 bigfile2 $ gzip bigfile3 $ xz bigfile4 $ ls -lh total 1.2M -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile -rw-r--r-- 1 emma emma 170K Jun 23 08:08 bigfile2.bz2 -rw-r--r-- 1 emma emma 179K Jun 23 08:08 bigfile3.gz -rw-r--r-- 1 emma emma 144K Jun 23 08:08 bigfile4.xz
Compare o tamanho dos arquivos comprimidos com o arquivo descomprimido chamado bigfile
. Observe também como as ferramentas de compressão adicionaram extensões aos nomes dos arquivos e removeram os arquivos não comprimidos.
Use bunzip2
, gunzip
ou unxz
para descomprimir os arquivos:
$ bunzip2 bigfile2.bz2 $ gunzip bigfile3.gz $ unxz bigfile4.xz $ ls -lh total 2.8M -rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile -rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile2 -rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile3 -rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile4
Observe que, desta vez, o arquivo comprimido foi excluído depois de descomprimido.
Certas ferramentas permitem diferentes níveis de compressão. Um nível de compressão mais alto geralmente requer mais memória e ciclos de CPU, mas resulta em um arquivo comprimido menor. O oposto é verdadeiro para um nível mais baixo. Veja abaixo uma demonstração com xz
e gzip
:
$ cp bigfile bigfile-gz1 $ cp bigfile bigfile-gz9 $ gzip -1 bigfile-gz1 $ gzip -9 bigfile-gz9 $ cp bigfile bigfile-xz1 $ cp bigfile bigfile-xz9 $ xz -1 bigfile bigfile-xz1 $ xz -9 bigfile bigfile-xz9 $ ls -lh bigfile bigfile-* * total 3.5M -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile -rw-r--r-- 1 emma emma 205K Jun 23 13:14 bigfile-gz1.gz -rw-r--r-- 1 emma emma 178K Jun 23 13:14 bigfile-gz9.gz -rw-r--r-- 1 emma emma 156K Jun 23 08:08 bigfile-xz1.xz -rw-r--r-- 1 emma emma 143K Jun 23 08:08 bigfile-xz9.xz
Não é necessário descomprimir um arquivo toda vez que ele for usado. As ferramentas de compressão geralmente vêm com versões especiais de ferramentas comuns usadas para ler arquivos de texto. Por exemplo, o gzip
tem uma versão de cat
, grep
, diff
, less
, more
e algumas outras. No gzip
, as ferramentas são prefixadas com um z
, enquanto o prefixo bz
existe para o bzip2
e xz
para o xz
. Veja abaixo um exemplo do uso de zcat
para ler um arquivo compactado com gzip
:
$ cp /etc/hosts ./ $ gzip hosts $ zcat hosts.gz 127.0.0.1 localhost # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters
Ferramentas de empacotamento
O programa tar
é provavelmente a ferramenta de empacotamento mais usada nos sistemas Linux. Caso você esteja se perguntando por que ela tem esse nome, trata-se de uma abreviação de “tape archive” (arquivo de fita). Os arquivos criados com o tar
são apelidados de tar balls. É muito comum que aplicativos distribuídos na forma de código-fonte estejam em tar balls.
A versão GNU do tar
incluída nas distribuições Linux tem muitas opções. Esta lição abordará o subconjunto mais usado.
Vamos começar criando um pacote com os arquivos usados para a compressão:
$ cd ~/linux_essentials-3.1 $ tar cf archiving/3.1.tar compression
A opção c
instrui o tar
a criar um novo arquivo e a opção f
é o nome do arquivo a ser criado. O argumento imediatamente após as opções sempre será o nome do arquivo no qual trabalhar. O restante dos argumentos são os caminhos para quaisquer arquivos ou diretórios que você deseje adicionar, listar ou extrair do arquivo. No exemplo, adicionamos o diretório compression
e todo o seu conteúdo ao pacote.
Para visualizar o conteúdo de um tar ball, use a opção t
do tar
:
$ tar -tf 3.1.tar compression/ compression/bigfile-xz1.xz compression/bigfile-gz9.gz compression/hosts.gz compression/bigfile2 compression/bigfile compression/bigfile-gz1.gz compression/bigfile-xz9.xz compression/bigfile3 compression/bigfile4
Note que as opções são precedidas por -
. Ao contrário da maioria dos programas, com o tar
o -
não é necessário ao especificar opções, embora não cause nenhum dano se for usado.
Note
|
Use a opção |
Agora vamos extrair o arquivo:
$ cd ~/linux_essentials-3.1/archiving $ ls 3.1.tar $ tar xf 3.1.tar $ ls 3.1.tar compression
Suponha que você precise apenas de um arquivo que esteja no pacote. Se for esse o caso, você pode especificá-lo após o nome de arquivo do pacote. É possível especificar vários arquivos, se necessário:
$ cd ~/linux_essentials-3.1/archiving $ rm -rf compression $ ls 3.1.tar $ tar xvf 3.1.tar compression/hosts.gz compression/ compression/bigfile-xz1.xz compression/bigfile-gz9.gz compression/hosts.gz compression/bigfile2 compression/bigfile compression/bigfile-gz1.gz compression/bigfile-xz9.xz compression/bigfile3 compression/bigfile4 $ ls 3.1.tar compression $ ls compression hosts.gz
Com exceção dos caminhos absolutos (caminhos começando com /
), os arquivos tar
preservam todo o caminho dos arquivos quando eles são criados. Como o arquivo 3.1.tar
foi criado com um único diretório, esse diretório será criado em relação ao seu diretório de trabalho atual quando for extraído. Para que isso fique mais claro, eis outro exemplo:
$ cd ~/linux_essentials-3.1/archiving $ rm -rf compression $ cd ../compression $ tar cf ../tar/3.1-nodir.tar * $ cd ../archiving $ mkdir untar $ cd untar $ tar -xf ../3.1-nodir.tar $ ls bigfile bigfile3 bigfile-gz1.gz bigfile-xz1.xz hosts.gz bigfile2 bigfile4 bigfile-gz9.gz bigfile-xz9.xz
Tip
|
Caso queira usar o caminho absoluto em um arquivo |
O programa tar
também pode gerenciar a compressão e descompressão de arquivos em tempo real. Para isso, o tar
chama uma das ferramentas de compressão discutidas anteriormente nesta seção. Basta adicionar a opção apropriada ao algoritmo de compressão. As mais usadas são j
, J
e z
para bzip2
, xz
e gzip
, respectivamente. Eis alguns exemplos usando os algoritmos mencionados acima:
$ cd ~/linux_essentials-3.1/compression $ ls bigfile bigfile3 bigfile-gz1.gz bigfile-xz1.xz hosts.gz bigfile2 bigfile4 bigfile-gz9.gz bigfile-xz9.xz $ tar -czf gzip.tar.gz bigfile bigfile2 bigfile3 $ tar -cjf bzip2.tar.bz2 bigfile bigfile2 bigfile3 $ tar -cJf xz.tar.xz bigfile bigfile2 bigfile3 $ ls -l | grep tar -rw-r--r-- 1 emma emma 450202 Jun 27 05:56 bzip2.tar.bz2 -rw-r--r-- 1 emma emma 548656 Jun 27 05:55 gzip.tar.gz -rw-r--r-- 1 emma emma 147068 Jun 27 05:56 xz.tar.xz
Observe como, no exemplo, os arquivos .tar
têm tamanhos diferentes. Isso mostra que foram compactados com sucesso. Ao criar arquivos compactados .tar
, sempre se deve adicionar uma segunda extensão de arquivo indicando o algoritmo usado. Elas são .xz
, .bz
e .gz
para xz
, bzip2
e gzip
, respectivamente. Às vezes, usam-se extensões encurtadas, como .tgz
.
É possível adicionar arquivos a pacotes tar não comprimidos já existentes. Para isso, usamos a opção u
. Se você tentar adicionar arquivos a um arquivo comprimido, aparecerá uma mensagem de erro.
$ cd ~/linux_essentials-3.1/compression $ ls bigfile bigfile3 bigfile-gz1.gz bigfile-xz1.xz bzip2.tar.bz2 hosts.gz bigfile2 bigfile4 bigfile-gz9.gz bigfile-xz9.xz gzip.tar.gz xz.tar.xz $ tar cf plain.tar bigfile bigfile2 bigfile3 $ tar tf plain.tar bigfile bigfile2 bigfile3 $ tar uf plain.tar bigfile4 $ tar tf plain.tar bigfile bigfile2 bigfile3 bigfile4 $ tar uzf gzip.tar.gz bigfile4 tar: Cannot update compressed archives Try 'tar --help' or 'tar --usage' for more information.
Gerenciando arquivos ZIP
As máquinas Windows geralmente não têm aplicativos para lidar com tar balls ou muitas das ferramentas de compressão comumente encontradas nos sistemas Linux. Se você precisar interagir com sistemas Windows, é aconselhável usar arquivos ZIP. Um arquivo ZIP é um pacote semelhante a um arquivo tar
compactado.
Os programas zip
e unzip
servem para trabalhar com arquivos ZIP em sistemas Linux. O exemplo abaixo mostra todo o necessário para você começar a usá-los. Primeiro, criamos um conjunto de arquivos:
$ cd ~/linux_essentials-3.1 $ mkdir zip $ cd zip/ $ mkdir dir $ touch dir/file1 dir/file2
Em seguida, usamos zip
para comprimir esses arquivos em um arquivo ZIP:
$ zip -r zipfile.zip dir adding: dir/ (stored 0%) adding: dir/file1 (stored 0%) adding: dir/file2 (stored 0%) $ rm -rf dir
Por fim, descompactamos o arquivo ZIP novamente:
$ ls zipfile.zip $ unzip zipfile.zip Archive: zipfile.zip creating: dir/ extracting: dir/file1 extracting: dir/file2 $ find . ./zipfile.zip ./dir ./dir/file1 ./dir/file2
Ao adicionar diretórios aos arquivos ZIP, a opção -r
faz com que o zip
inclua o conteúdo desses diretórios. Sem ele, teríamos um diretório vazio no arquivo ZIP.
Exercícios Guiados
-
Com base nas extensões, quais das seguintes ferramentas foram usadas para criar estes arquivos?
Nome do Arquivo tar
gzip
bzip2
xz
archive.tar
archive.tgz
archive.tar.xz
-
Com base nas extensões, quais destes arquivos estão empacotados e quais estão comprimidos?
Nome do Arquivo Empacotado Comprimido file.tar
file.tar.bz2
file.zip
file.xz
-
Como se adiciona um arquivo a um arquivo
tar
comprimido comgzip
? -
Qual opção de
tar
instrui otar
a incluir o caractere inicial/
nos caminhos absolutos? -
O
zip
suporta diferentes níveis de compressão?
Exercícios Exploratórios
-
Ao extrair arquivos, o
tar
suporta globs na lista de arquivos? -
Como garantir que um arquivo descomprimido fique igual ao arquivo antes da compressão?
-
O que acontece quando tentamos extrair de um pacote
tar
um arquivo que já existe em seu sistema de arquivos? -
Como extrair o arquivo
archive.tgz
sem usar a opçãotar
z
?
Resumo
Os sistemas Linux oferecem diversas ferramentas de compressão e empacotamento. Esta lição abordou as mais comuns. A ferramenta de empacotamento mais comum é o tar
. Se for necessário interagir com sistemas Windows, zip
e unzip
ajudam a criar e extrair arquivos ZIP.
O comando tar
tem algumas opções que vale a pena memorizar. Elas são: x
para extrair, c
para criar, t
para visualizar o conteúdo e u
para adicionar ou substituir arquivos. A opção v
lista os arquivos que são processados pelo tar
ao criar ou extrair um arquivo.
O repositório típico de uma distribuição Linux inclui muitas ferramentas de compressão. As mais comuns são gzip
, bzip2
e xz
. Os algoritmos de compressão geralmente oferecem suporte a diferentes níveis de compressão para otimizar a velocidade ou o tamanho do arquivo. Os arquivos podem ser descomprimidos com gunzip
, bunzip2
e unxz
.
As ferramentas de compressão geralmente têm programas que se comportam como ferramentas comuns para arquivos de texto, com a diferença de que funcionam em arquivos comprimidos. Dentre eles temos o zcat
, bzcat
e xzcat
. As ferramentas de compressão costumam vir com programas com as funcionalidades grep
, more
, less
, diff
e cmp
.
Comandos usados nos exercícios:
bunzip2
-
Descomprime um arquivo comprimido
bzip2
. bzcat
-
Exibe o conteúdo de um arquivo comprimido
bzip
. bzip2
-
Comprime arquivos usando o algoritmo e o formato
bzip2
. gunzip
-
Descomprime um arquivo comprimido
gzip
. gzip
-
Comprime arquivos usando o algoritmo e o formato
gzip
. tar
-
Cria, atualiza, lista e extrai pacotes
tar
. unxz
-
Descomprime um arquivo comprimido
xz
. unzip
-
Descomprime e extrai conteúdo de um arquivo ZIP.
xz
Comprime arquivos usando o algoritmo e o formato xz
.
zcat
-
Exibe o conteúdo de um arquivo comprimido
gzip
. zip
-
Cria e comprime pacotes ZIP.
Respostas aos Exercícios Guiados
-
Com base nas extensões, quais das seguintes ferramentas foram usadas para criar estes arquivos?
Nome do Arquivo tar
gzip
bzip2
xz
archive.tar
X
archive.tgz
X
X
archive.tar.xz
X
X
-
Com base nas extensões, quais destes arquivos estão empacotados e quais estão comprimidos?
Nome do Arquivo Empacotado Comprimido file.tar
X
file.tar.bz2
X
X
file.zip
X
X
file.xz
X
-
Como se adiciona um arquivo a um arquivo
tar
comprimido comgzip
?Descomprimimos o arquivo com
gunzip
, adicionamos o arquivo comtar uf
e em seguida o comprimimos comgzip
-
Qual opção de
tar
instrui otar
a incluir o caractere inicial/
nos caminhos absolutos?A opção
-P
. Segundo a página man:-P, --absolute-names Don't strip leading slashes from file names when creating archives
-
O
zip
suporta diferentes níveis de compressão?Sim. Usaríamos
-#
, substituindo#
por um número de 0-9. Segundo a página man:-# (-0, -1, -2, -3, -4, -5, -6, -7, -8, -9) Regula a velocidade da compressão usando o dígito especificado #, onde -0 indica sem compressão (armazena todos os arquivos), -1 indica a velocidade de compressão mais rápida (menos compressão) e -9 indica a velocidade de compressão mais lenta (compressão ideal, ignora a lista de sufixos). O nível de compressão padrão é -6. Embora ainda esteja sendo trabalhada, a intenção é que essa configuração controle a velocidade de compressão para todos os métodos de compressão. Atualmente, apenas a deflação é controlada.
Respostas aos Exercícios Exploratórios
-
Ao extrair arquivos, o
tar
suporta globs na lista de arquivos?Sim, com a opção
--wildcards
.--wildcards
deve ser colocado logo após o arquivotar
ao se usar o estilo de opções sem hífen. Por exemplo:$ tar xf tarfile.tar --wildcards dir/file* $ tar --wildcards -xf tarfile.tar dir/file*
-
Como garantir que um arquivo descomprimido fique igual ao arquivo antes da compressão?
Não é preciso fazer nada com as ferramentas mostradas nesta lição. As três incluem somas de controle no formato de arquivo, que são verificadas quando eles são descomprimidos.
-
O que acontece quando tentamos extrair de um pacote
tar
um arquivo que já existe em seu sistema de arquivos?O arquivo no sistema de arquivos é sobrescrito com a versão que está no arquivo
tar
. -
Como extrair o arquivo
archive.tgz
sem usar a opçãotar
z
?Seria preciso descomprimi-lo antes com o
gunzip
.$ gunzip archive.tgz $ tar xf archive.tar