tar – Agrupando arquivos
Compactar arquivos e diretórios para o que chamamos de arquivo compactado tem na verdade duas fases: primeiro agrupa-se os arquivos e diretórios em um só, depois compacta-se este arquivo agrupado.
O tar é um utilitário que faz o primeiro passo. Ele é um programa de arquivamento feito para armazenar e extrair arquivos e diretórios do que chamamos de “arquivo tar” (ou tarball). Por padrão, o tar espera que os procedimentos de armazenamento e extração sejam feitos em uma fita DAT, mas graças ao parâmetro -f podemos utilizá-lo em arquivos comuns do sistema. Por enquanto, aqui trabalharemos apenas em arquivos.
Por agrupar todos os arquivos em um só, o tar é a ferramenta padrão para distribuição de arquivos. Provavelmente qualquer programa ou código-fonte para Linux que vermos disponível na Internet estará neste formato, acrescentado de uma compactação que veremos adiante.
Sintaxe: $ tar <ação> [opções] <tarball destino> <arquivos> [arquivos2] ...
Na ação, vamos ressaltar que podemos utilizar uma destas três: -c para criar (agrupar), -x para extrair (desagrupar) e -t para listar. Existem outras ações também, caso queira saber consulte a página de manual.
Criando um arquivo chamado backup-etc.tar:
# cd / # tar -cvf backup-etc.tar etc/ ...corte... # ls -lh backup-etc.tar -rw-r--r-- 1 root root 23M 2008-08-31 02:12 backup-etc.tar
Note que usamos a opção -v, que ativa o modo verbose, mostrando todos os arquivos que estão sendo processados.
Agora vamos listar o conteúdo do arquivo que criamos:
# tar -tf backup-etc.tar ...corte...
Como está tudo dentro do arquivo, vamos descompactá-lo dentro do diretório /tmp/backup-etc:
# mkdir -p /tmp/backup-etc # cd /tmp/backup-etc # tar -xvf /backup-etc.tar ...corte... # ls
Pronto. Uma cópia do diretório /etc!
gzip, bzip2 – Compactar e descompactar arquivos
Agora que temos todos os arquivos agrupados em um só, podemos utilizar o gzip ou bzip2 para compactar este arquivo. A diferença entre os dois é apenas em seu algoritmo, ou seja, o modo e a eficiência com que compactam. O gzip existe há muito mais tempo, é menos faminto em termos de processamento. O bzip2 tem uma compactação melhor (principalmente para arquivos texto), mas utiliza muito mais o processador.
A extensão de arquivos em gzip é .gz. A extensão de arquivos em bzip2 é bz2.
Sintaxe: $ gzip [-d] arquivo[.gz] Sintaxe: $ bzip2 [-d] arquivo[.bz2]
Ao compactar um arquivo, o programa automaticamente adiciona a extensão correspondente ao seu nome. Exemplo:
$ ls -lh texto* -rw-r--r-- 1 eitch eitch 89K 2008-06-20 02:26 texto -rw-r--r-- 1 eitch eitch 89K 2008-06-20 02:26 texto2 $ gzip texto $ bzip2 texto2 $ ls -lh texto* -rw-r--r-- 1 eitch eitch 26K 2008-08-31 02:26 texto2.bz2 -rw-r--r-- 1 eitch eitch 30K 2008-08-31 02:26 texto.gz
Ao descompactar estes arquivos, o programa irá retirar automaticamente a sua extensão. Vamos descompactar os arquivos criados anteriormente:
$ gzip -d texto.gz $ bzip2 -d texto2.bz2 $ ls -lh texto* -rw-r--r-- 1 eitch eitch 89K 2008-08-31 02:26 texto -rw-r--r-- 1 eitch eitch 89K 2008-08-31 02:26 texto2
Agora vamos compactar o arquivo backup-etc.tar criado com o comando tar:
# cd / # ls -lh backup-etc.tar -rw-r--r-- 1 root root 23M 2008-08-31 02:30 backup-etc.tar # bzip2 backup-etc.tar # ls -lh backup-etc.tar.bz2 -rw-r--r-- 1 root root 2.1M 2008-08-31 02:30 backup-etc.tar.bz2
O que era antes 23MB, agora 2.1MB.
Ao descompactar os arquivos, podemos utilizar também os comandos gunzip e bunzip2, que fazem exatamente a mesma coisa que a opção -d do gzip e bzip2. Por exemplo, isto seria o equivalente para descompactar o arquivo backup-etc.tar.bz2 recém-criado:
$ bunzip2 backup-etc.tar.bz2
Para facilitar as coisas e não precisar usar dois comandos para compactar e descompactar vários arquivos, o tar possui dois parâmetros que integram o gzip2 e bzip2: -z e -j respectivamente. Ao utilizar estes parâmetros no agrupamento ou na extração, ele vai utilizar o respectivo compactador. Por exemplo, para fazer o backup dos diretórios /boot e /etc apenas com o tar:
# cd / # tar -cjvf backup2.tar.bz2 boot/ etc/ ...corte... # ls -lh backup2.tar.bz2 -rw-r--r-- 1 root root 18M 2008-08-31 02:43 backup2.tar.bz2
Desta vez já criamos o arquivo compactado. Para descompactar é a mesma coisa, basta apenas acrescentar o parâmetro do compactador ao comando tar:
# cd /tmp/backup # tar -xjvf /backup2.tar.bz2 ...corte...
zip, rar – Outros formatos de arquivos compactados
Além dos dois tradicionais formatos de arquivos compactados (gzip e bzip2), podemos encontrar arquivos em outros formatos bem populares, como o ZIP e RAR. O ZIP é talvez um dos formatos de compactação mais antigos para quem este trabalhando em plataformas que não sejam UNIX…
Para compactar um arquivo no formato zip, utilizamos o comando zip da seguinte forma:
$ zip -r lab.zip /home/eitch/lab/ ...corte...
O comando acima irá jogar no arquivo lab.zip o diretório /home/eitch/lab. O parâmetro -r no comando indica o fator recursivo: o zip vai compactar o diretório e todos seus arquivos e sub-diretórios. Se o -r não fosse usado, teríamos apenas o diretório lab/, sem mais nada.
Para descompactar o mesmo arquivo utilizamos o comando unzip:
$ unzip lab.zip ...corte...
Isto descompactará o arquivo lab.zip dentro do diretório atual. Pode ser útil que ao invés de ir descompactando logo o arquivo, verificar o que tem nele primeiro. Para isso basta executar:
$ unzip -l lab.zip ...corte...
Já o formato RAR, um popular formato de arquivo que circula principalmente em comunidades Peer-to-Peer, geralmente não vem junto com as distribuições Linux devido à sua licença proprietária. Por esse motivo, não recomendamos que você o utilize. Caso seja preciso, os utilitáros do RAR podem ser encontrados no endereço:
Alguns repositórios de terceiros distribuem pacotes de distribuição com o nome unrar. O unrar é o responsável pela descompactação dos arquivos em formato RAR e pode ser usado da seguinte forma:
$ unrar e arquivo.rar
Isto irá descompactar todo o conteúdo do arquivo.rar para o diretório atual. Para listar o conteúdo do arquivo:
$ unrar l arquivo.rar
Referências
- XKCD 1168 – Mais de uma década depois, isso continua acontecendo… :)