tar - dicas, scripts e exemplos de linha de comando.

Atualizado em: 20/12/2007



Sobre este documento

Original em formato texto com marcações para txt2tags, conversão em HTML e atualização do site via script.

Linhas de comando e scripts utilizando tar.

tar na interface gráfica - Konqueror - gerenciador de arquivos do KDE

Em linha de comando e scripts tem mais versatilidade, mais rápido, funciona em qualquer ambiente e outras vantagens, também pode ser mais difícil para quem não tem habilidades em trabalhar na linha de comando.

Tem que prefere o modo texto e tem quem prefere o ambiente gráfico, mesmo que precisa de vários cliques e demora um pouco mais do que uma simples linha de comando, navegar em ambiente gráfico é muito fácil e intuitivo, também pode criar scripts e executar a partir de atalho no desktop ou agendar.

Criar arquivo .tar.gz via konqueror

Clique com botão auxiliar sobre o arquivo ou diretório que deseja empacotar, as opções mudam conforme a instalação, procure em "ações", "empacotar" ou termos semelhantes.

Descompactar arquivo .tar.gz via konqueror.

Mesmo que tenha utilizado script ou linha de comando na criação do .tar.gz, pode descompactar via konqueror, basta um clique com botão auxiliar sobre o arquivo, selecione -> "ações" -> "extrair para..." vai abrir o utilitário Ark, continue navegando nas opções e escolha onde deseja salvar e Ok,

Consultar e navegar dentro do arquivo compactado.

Konqueror -> Duplo clique no arquivo .tar.gz, nesta mesma janela do konqueror será criado um diretório com o mesmo nome do original de onde criou o .tar.gz, por exemplo, se utilizou um ponto de montagem em /mnt/alguma-coisa na criação do .tar.gz, nesta janela do konqueror vai aparecer um diretório mnt, vá navegando dentro dos diretórios até encontrar o arquivo que deseja, quando achar o arquivo desejado, pode arrastar para outro diretório, abrir e etc...

Exemplo, navegar no arquivo cl10-hda3.tar.gz que é um backup de uma instalação onde foi utilizado o ponto de montagem /mnt/hd2, quando navegar neste arquivo, na URL do konqueror aparece algo assim: tar:/root/cl10-hda3.tar.gz/mnt/hd2/etc isto é feito em arquivos temporários, existem somente nas janelas do konqueror enquanto em uso, não fica disponível para acesso via linha de comando, mesmo que indique um ponto de montagem ele não será afetado.

Via Gnome também pode usar o Konqueror ou o File Roller

tar + gzip - Resumo de linhas de comando

Formato para criar novo arquivo (empacotar e compactar)

  tar -zcvf arqdestino.tar.gz arqorigem
       ||||    |                |_arquivo, diretório ou multiplas opções.
       ||||    |_arquivo destino, arquivão com todos arquivos e/ou diretórios.
       ||||
       ||||_salvar no arquivo indicado, quando omitido procura pela unidade de fita DAT.
       |||__Verbose - exibir mensagens no console
       ||___criar novo arquivo de armazenamento
       |____chama gzip - compactar com gzip

Formato para extrair arquivos, desempacotar e descompactar

  tar -zxvf arquivo.tar.gz -C /tmp
       ||||    |            |  |_caminho destino para salvar arquivos extraidos.
       ||||    |            |_criar diretório destino, quando omitido salva a partir do diretório corrente.
       ||||    |_arquivo empacotado pelo tar, arquivão contendo arquivos e/ou diretórios.
       ||||
       ||||_extrair do arquivo indicado, quando omitido procura pela unidade de fita DAT.
       |||__Verbose - exibir mensagens no console
       ||___extrair arquivos 
       |____chama gzip - descompactar com gzip

Alguns exemplos de linha de comando.

Empacotar arquivos do diretório corrente, sem compactar e sem mensagens no console (sem paramentos zv).

tar cf todostxt.tar *.txt

Neste formato não exibe mensagens, pega somente os .txt do diretório corrente, não pega sub-diretórios

Empacotar diretórios se seus sub-diretórios, exemplo para tudo que estiver abaixo de /home/zago e sem compactar use:

tar cvf arquivo.tar /home/zago

Empacotar e compactar

tar cvfz arquivo.tar.gz /home/zago

No exemplo acima foi informado o caminho completo a partir do raiz, (/home/zago), quando desempacotar vai salvar o caminho completo e criar os sub-diretórios a partir do diretório que executar o comando, ou no mesmo local de origem quando indicou o caminho completo no empacotamente e para extrair indique a partir do raiz( -C / ).

Desempacotar tar xvf arquivo.tar`

Descompactar e desempacotar, omitindo o destino cria sub-diretorio a partir do diretório local;

  tar xvfz arquivo.tgz
  
  tar xvfz arquivo.tar.gz
  
  com -C / salva a paritr do raiz.
  tar -zxvf arquivo.tar.gz -C /
  
  com -C /caminho salva a partir do diretório indicado, exemplo para /tmp
  tar -zxvf arquivo.tar.gz -C /tmp

Para não salvar o caminho completo, execute a linha de comando de criação do arquivão tar em diretório acima do que deseja empacotar, exemplos para empacotar os diretórios /home/zago e /home/zago/guiaz, sem incluir o caminho completo.

  cd /home/
  tar -zcvf homezago.tar.gz zago
  
  cd /home/zago/
  tar -zcvf zagoguiaz.tar.gz guiaz 

Neste exemplo acima não guarda o caminho completo de origem, na extração dos arquivos cria somente o sub-dirtório a partir do diretório local ou abaixo do caminho indicado (-C /caminho).

Incluir data de criação no nome do arquivo

  cd /home/zago
  tar -zcvf guiaz-`date +%d%m%y`.tar.gz  /home/zago/guiaz
  
  Com exclusão de dois sub-diretórios (apostilas e drivers)
  cd /home/zago
  tar -zcvf Linux-BR-FAQ-`date +%d.%b.%Y`.tar.gz --exclude /home/zago/guiaz/apostilas --exclude /home/zago/guiaz/drivers guiaz
  

Usando multi-volume, do man do tar

         -L, --tape-length N
                muda a fita após gravar N*1024 bytes
  
         -M, --multi-volume
                cria/lista/extrai arquivos multivolumes

pesquisar dentro do tar.gz, selecionar arquivo

tar -tzf arquivo.tar.gz "t" para ver o conteúdo.

tar -tzf dirzago.tar.gz

Quando a lista for grande desvie o resultado da pesquisa para um arquivo texto:

tar -tzf dirzago.tar.gz >> /home/zago/teste

depois visualize o resultado editando /home/zago/teste com seu editor preferido.

ou com pausa em cada página:

tar -tzf dirzago.tar.gz | more

Porcurar arquivo especifico, exemplo de procura por comandos.txt dentro de um .tar.gz

  tar -tvzf nome-do-arq.tar.gz | grep nome-que-procuro
  
  tar -tvzf homezago-30nov2005.tar.gz | grep comandos.txt
  
  [zago@servsamba zago]$ tar -tvzf homezago-30nov2005.tar.gz | grep comandos.txt
  -rwxrwxrwx zago/zago     60965 2005-08-31 19:09:13 home/zago/guiaz/comandos.txt

Extrair somente um arquivo do .tar.gz, precisa informar o caminho e nome do arquivo, quando não souber, use a opção acima para descobrir, exemplo para retirar de dentro do .tar.gz somente o arquivo acima (comandos.txt), execute;

  tar -zxvf homezago-30nov2005.tar.gz home/zago/guiaz/comandos.txt
  
  [zago@servsamba zago]$ tar -zxvf homezago-30nov2005.tar.gz home/zago/guiaz/comandos.txt
  home/zago/guiaz/comandos.txt
  
  [zago@servsamba zago]$ ls -la home/zago/guiaz/comandos.txt
  -rwxrwxr-x  1 zago zago 60965 2005-08-31 19:09 home/zago/guiaz/comandos.txt

tar -xzf arquivo.tar.gz "x" para extrair os arquivos.

Restaurar instalação, voltar arquivos

Indicar outro diretório, restaurar em local diferente da copia.

use -C, --directory DIR mudar para o diretório DIR ex.:

  tar xf /home/backup/arq.tar  -C /home/zago/doc/arq.doc
  
  tar zxvf /home/zago/arquivo.tar.gz  -C /tmp

Restaurar a partir da raiz "/", dentro do diretório onde está a copia, execute:

tar -zxvf arquivo.tar.gz -C /

Este comando é útil para recuperar instalação completa de HD, descompacta o arquivo.tar.gz e salva no mesmo ponto de montagem utilizado na criação do mesmo, portanto requer a indicação do caminho completo na criação do .tar.gz e na restauração precisa montar a partição no mesmo ponto de montagem que utilizou para criar o .tar.gz, caso não tenha o ponto de montagem ou permissão para gravação, retornará erro ou criará diretórios a partir do raiz, portando não salva na partição correta.

Para descobrir qual o caminho (ponto de montagem) utilizado na criação do arquivo de backup .tar.gz, execute;

tar -ztvf arquivo.tar.gz | head -5

Este comando não salva nada em disco, somente exibe as 5 primeiras linhas no console, exemplo;

  drwxr--r-- root/root         0 1969-12-31 21:00:00 mnt/win/
  drwxr--r-- root/root         0 2005-08-21 03:13:20 mnt/win/win98/

como pode ver, neste exemplo o ponto de montagem é /mnt/win

Incluir data de criação no nome de arquivo.tar.gz

Incluir a data atual no nome do arquivo tar, alguns exemplos de comando e resultados.

Nestes exemplos cria um tar do diretório /home/zago/guiaz, cria arquivo tar com nome Linux-BR-FAQ-mais-data-de-criacao.tar.gz, veja os comandos com o resultado

  tar -zcvf Linux-BR-FAQ-`date +%d.%b.%Y`.tar.gz /home/zago/guiaz
  Linux-BR-FAQ-08.Ago.2004.tar.gz
  
  tar -zcvf Linux-BR-FAQ-`date +%d%m%y`.tar.gz /home/zago/guiaz
  Linux-BR-FAQ-080804.tar.gz

Incluir também a hora e minutos, não utilize ":" como separador porque é um simbolo não válido em nome de arquivos, exemplos:

  tar -zcvf Linux-BR-FAQ-`date +%d.%b.%Y-%H-%M`.tar.gz /home/zago/guiaz
  Linux-BR-FAQ-08.Ago.2004-17-14.tar.gz

Consulte o manual, man date

Tem outras opções de datas e formatos, tais como; incluir a hora no formato de 12 horas, com ou sem o zero a esquerda e muito mais, incluir o nome do dia da semana, veja o formato desejado e substitua nos exemplos acima.

Muito útil para nomear arquivos em backup, evita que o novo arquivo sobrepõe o já existente, facilita a organização e identificação dos arquivos.

Este formato de nomear arquivos podem ser utilizados por qualquer outro utilitário ou comando.

Observe que "date" e as variáveis estão dentro crase ` ` , para obter uma crase, pressione a tecla da crase e depois a barra de espaço, ou prefira copiar e colar e de outro local.

backup por usuário - tar por diretório de usuário

Como root para ter acesso ao diretório dos outros users

Lembre de fazer uma cópia completa do home do usuário antes de removê-lo.

No nosso exemplo teremos um diretório /home/copias onde será gravado o arquivo de cópia com o nome do usuário mais a data de criação.por exemplo backup do usuário zago que está em /home/zago executamos a linha:

  tar -zcvf /home/copias/zago-`date +%d%m%y`.tar.gz /home/zago

no final da execução tenho em /home/copias um arquivo zagodatadehoje.tar.gz com tudo que tem em /home/zago.

Exemplo com exclusão de arquivos desta cópia, crie o arquivo com a lista de exclusão, como exemplo /etc/copianao, formato de linha de comando para excluir esta listagem do backup.

  tar -zcvf /home/copias/zago-`date +%d%m%y`.tar.gz /home/zago --exclude-from=/var/copianao

Mais detalhes sobre seleção no tar, veja neste documento o tópico "tar com seleção/exclusão"

tar + find para seleção de arquivos por usuário

  tar  -cvf arquivo.tar `find  . -user zago -print`

Compactando:

  tar  -cvzf arquivo.tar.gz `find  . -user zago -print`

Esta combinação é útil mas prefiro usar o caminho completo em scripts.

tar + data + find - seleção por data de arquivo

Incluir a data de criação no nome do arquivo, nomeie o arquivo neste formato;

  tar -zcvf /home/copias/arquivo-`date +%d%m%y`.tar.gz /home/zago

o sinal que aparece em arquivo-`date +%d%m%y`.tar.gz é crase ou backquote (`), cuidado para não confundir com apas simples ou quote (').

Tem um espaço entre "date +", com y minúsculo o ano tem dois dígitos com Y maiúsculo tem os quatro dígitos.

Pesquisar com find em /tmp/guiaz para criar guiaz.tar.gz contendo todos arquivos .txt.

  find /tmp/guiaz -name "*.txt" | xargs tar -zcvf guiaz.tar.gz 

Alguns exemplos de uso combinando find por data com tar, fique atendo ao caminho, tanto para salvar como de procura, nestes exemplos o caminho destino do .tar.gz é omitido, portanto salva no diretório corrente, os demais caminhos para find e tar são informados, neste caso indicado arquivos ou diretórios de procura, sempre faça testes em ambiente de testes, crie diretórios de testes...

  
  Empacotar somente os .dbf alterados nas ultimas 24 horas.
  
  find /home/sistema/bcodados/*.dbf -mtime 0 | tar zcvf dadosdbf-`date +%Y%m%d`.tar.gz -T -
  
  Empacontar todos .dbf com exclusão de um arquivo, coloque ele etre aspas, exemplo de exclusão de locmod.dbf, faz backup de todos .dbf  do caminho indicado, com excessão do arquivo locmod.dbf, quando indica os arquivos não desce nos sub-diretórios, no exemplo abaixo pega somente arquivos dentro de bcodados 
  
  tar -zcvf  /backup/dadosdbf-`date +%Y%m%d`.tar.gz /home/sistema/bcodados/*.dbf --exclude="locmod.dbf"
  
  O mesmo exemplo acima com uso do find para selecionar somente os .dbf modificados nas ultimas 24 horas, excluindo do backup o arquivo locmod.dbf,  ele não entra no backup mesmo que alterado nas ultimas 24 horas.
  
  find /home/sistema/bcodados/*.dbf -mtime 0 | tar zcvf dadosdbf-`date +%Y%m%d`.tar.gz -T - --exclude="/home/sistema/bcodados/locmod.dbf"
  
  Backup do diretório bcodados e seus sub-diretórios, com exclusão de arquivos *.cdx, *.ntx e locmod.dbf, neste exemplo pega também sub-diretórios de bcodados/
  
  tar -zcvf  /backup/dadosdbf-`date +%Y%m%d`.tar.gz /home/sistema/bcodados/ --exclude=*.cdx --exclude=*.ntx --exclude="locmod.dbf"
  
  
  
  
  Exemplo de script para criar arquivo no formato aquivo+ano+mes+dia do sistema (`date +%Y%m%d`), nomear arquivos neste formato dadosdbf-20070613.tar.gz
  No final envia por scp para outra maquina e apaga o arquivo na maquina local,  exemplo em modo interativo, precisa digitar a senha. Tem outros meios de automatizar esta transferencia, troque o uso de scp por ssh sem senha, mount, ftp, e-mail ou outro modo 

find /home/samba/bcodados/*.dbf | tar zcvf dadosdbf-`date +%Y%m%d`.tar.gz -T - --exclude="/home/samba/bcodados/locmod.dbf" scp dadosdbf-`date +%Y%m%d`.tar.gz zago@192.168.1.2:~/ rm -rf sdbf-`date +%Y%m%d`.tar.gz

  Cuidado com  a virada do dia, script que inicia antes e termina depois da meia noite,  nestes casos crie a variável no inicio do script contendo a data, trabalhe com ela do inicio ao fim  para evitar erros no nome do arquivo 
  
  Exemplo para criar variável com nome de arquivo mais data.
  

MARQUIVO=`date +'guiaz-%d-%b-%Y.tar.gz'` tar -zcvf $MARQUIVO /home/zago/guiaz

ls guiaz-08-Ago-2004.tar.gz

  
  
  Outros exemplos
  
  find /home/zago/guiaz -mtime -1 -type f -print | tar zcvf meusarq.tar.gz -T -
  
  tar -zcvf meusarq.tar.gz `find . -user zago -print`
  
  tar -zcvf meusarq.tar.gz `find /home/zago/docs -user zago -print` 

Script com exemplo de exclusão de arquivos.
Script Shell de Backup Incremental
http://www.dicas-l.com.br/cantinhodoshell/print/cantinhodoshell_20070130.html

tar + ssh - salvar em maquina remota

Exemplos de uso do comando tar com ssh, compactar arquivo local e salvar em outra maquina, em uma linha de comando ou script, prático para salvar copia remota ou quando não tem espaço livre na maquina local.

  tar -zcvf hzrede.tar.gz  /home/zago/rede  | scp hzrede.tar.gz zago@192.168.1.53:~/
  
  Incluindo a data no nome do arquivo; 
  tar -zcvf hzrede-`date +%d%m%y`.tar.gz  /home/zago/rede  | scp hzrede-`date +%d%m%y`.tar.gz zago@192.168.1.53:~/

Use o mesmo nome de arquivo em tar e scp.

Outros formatos de data consulte o tópico tar+data

Dicas, tutoriais e FAQ sobre ssh;
http://www.zago.eti.br/ssh/ssh.html

tar com seleção/exclusão de arquivos e/ou diretórios

Excluir um sub-diretório, exemplo para compactar o diretorio /home/zago menos o subdiretorio /home/zago/tmp

  tar zcvf zagosemtmp.tar.gz --exclude /home/zago/tmp /home/zago

Exemplo de uma rotina de backup de uma lista de diretórios menos alguns alguns arquivos ou tipo de arquivo.

Criar arquivo tar dos diretórios listados em um arquivo, exceto os arquivos listados em outro arquivo, são dois arquivos, um com a lista do diretórios do backup, outro com a lista dos arquivos excluidos, arquivos que estão dentro dos diretórios de backup que não serão copiados.

Crie um arquivo copiasim contendo os diretórios que QUER COPIAR, exemplo de um copiasim

  /home/zago/guiaz/
  /home/zago/evolution/
  /home/zago/genealogia/
  /home/zago/doc/
  /etc/

Crie um arquivo copianao contendo a lista de arquivos ou terminações que NÃO QUER COPIAR, exemplo de um copianao

  *.txt~
  *.html~
  *.tmp
  *.$*
  *.~*
  *.bak
  *.swp
  SWAP
  swap
  ~*.*
  core*.*

Salve em um diretório qualquer, neste exemplo utilizei /var, na linha de comando do tar precisa indicar o caminho e nome do arquivo.

Exemplo de linha de comando utilizando os exemplos acima:

tar -zcvf /home/copias/dirzago-`date +%d%m%y`.tar.gz -T /var/copiasim --exclude-from=/var/copianao

ou se preferir:

  tar -zcvf /home/copias/dirzago-`date +%d%m%y`.tar.gz \
  -T /var/copiasim \
   --exclude-from=/var/copianao

explicando:

tar -zcvf /home/copias/dirzago-`date +%d%m%y`.tar.gz

Salva o arquivo em /home/copias com o nome dirzago-datadecriação.tar.gz

-T /var/copiasim

Arquivo de inclusão, contendo a lista de diretórios e arquivos do backup.

--exclude-from=/var/copianao

Arquivo de exclusão, contendo a lista de arquivos ou diretórios excluidos do backup, são arquivos e diretórios que estão dentro dos diretórios listados em copiasim mas não serão copiados, como exemplo na listagem, estão os temporários.

Resultado final, arquivo dirzago-datadecriação.tar.gz em /home/copias, contendo os diretórios listados em copiasim menos o que está listado no arquivo copianao.

Pode incluir varias linhas de comando em script, em lugar de criar um arquivão de tudo, pode dividir em linhas de comando para criar tar por usuários, grupos e etc...,

Parte de um script utilizando montagem NFS da maquina com IP 192.168.1.200, diversos exemplos de uso do tar.

  #!/bin/bash
  mount -tnfs 192.168.1.200:/home/copia /mnt/copia
  tar -zcvf /mnt/copia/alunos-`date +%d%m%y`.tar.gz  -T /var/alunos  --exclude-from=/var/copianao
  tar -zcvf /mnt/copia/zago-`date +%d%m%y`.tar.gz  /home/zago/*  --exclude-from=/var/copianao
  tar -zcvf /mnt/copia/turmas-`date +%d%m%y`.tar.gz  /home/turm*  --exclude-from=/var/copianao
  # CORTADO ALGUMAS LINHAS PARA DIMINUIR O TAMANHO DESTE TEXTO.
  # as linhas abaixo não funcionam
  # tar -zcvf /mnt/copia/doc-`date +%d%m%y`.tar.gz -T `find /home/ -name \*.d*`   --exclude-from=/var/copianao
  # erro: bash: /bin/tar: Lista de argumentos muito longa
  # tar -zcvf /mnt/copia/Doc-`date +%d%m%y`.tar.gz -T `find /home/ -name \*.D*`   --exclude-from=/var/copianao
  # erro: bash: /bin/tar: Lista de argumentos muito longa
  # tar -zcvf /mnt/copia/Doc-`date +%d%m%y`.tar.gz -T `find /home/alunos -name *.D*`   --exclude-from=/var/copianao
  #tar -zcvf /mnt/copia/Doc-`date +%d%m%y`.tar.gz -T `find /home/alunos -name *.D*` 
  # esta pegando os arquivos .DLL e dat
  # tar -zcvf /mnt/copia/Doc-`date +%d%m%y`.tar.gz -T `find /home/alunos -name \*.DOC` 
  # tar -zcvf /mnt/copia/Doc-`date +%d%m%y`.tar.gz  /home/*.D*  --exclude-from=/var/copianao
  # erro tar: /home/*.D*: Cannot stat: Arquivo ou diretório não encontrado
  umount /mnt/copia

Explicando:

Máquina na rede com IP 192.168.1.200 exportando por NFS o diretório /home/copia, outra maquina desta rede executa o script acima, a primeira linha monta este diretório.

A segunda linha compacta o que tem listado em /var/alunos, exceto o listado /var/copianao, salva no arquivo com nome de alunos-datadecriação.tar.gz

Na terceira linha faz backup do diretório /home/zago menos o listado em /var/copianao

Na quarta linha faz backup de todos os diretórios que iniciam com turm, tenho um diretório para cada turmaxxx e nesta linha faço um backup de todas.

A partir da quinta linha não está funcionando, preciso testar com find, fazer backup somente de arquivos .doc, .xls, .bmp e .txt .gdb e .dbf que estão no /home , conforme relação no arquivo /var/doc, as duas maneiras não funcionou, qualquer dia faço novos testes.

por ultimo a desmontagem do que foi montado na primeira linha; umount /mnt/copia

tar de diretórios /home

Script para fazer backup de todos os diretórios /home conforme listagem e por último criar um tar de todo o /home exceto os diretórios listados em arquivo.

A linha de comando abaixo cria um arquivo com todos os diretório de /home, use seu editor preferido para ajustar ou excluir eventuais sub-diretórios, a primeira linha funciona no SUSE 10.1 e a segunda no CL10, o resultado pode ser diferente em sua instalação, deve ter um diretório por linha neste formato.

  /home/contabil
  /home/netlogon
  /home/vendas
  /home/zago

ls -ld /home/* | awk '{print $9}' > /tmp/dirhome.txt

ls -ld /home/* | awk '{print $8}' > /tmp/dirhome.txt

Exemplo de script para modificar e adaptar conforme sua instalação.

cat tarhome

  #!/bin/bash
  while read LINHA ; do
    # seus comandos aqui, exemplo para testar e remover as barras
    # echo $LINHA
    MDIR=`echo $LINHA | sed "s|/||g"`
    MVAR2=`echo $MDIR`-`date +%d.%b.%Y`
    tar czvf $MVAR2.tar.gz $LINHA
  done < /tmp/dirhome.txt
  tar -zcvf /home/outros-`date +%d%m%y`.tar.gz /home --exclude-from=/tmp/dirhome.txt
  tar -zcvf dirtemp-`date +%d%m%y`.tar.gz /tmp 

No diretório onde executou ou indicar para salvar os arquivos, deverá criar arquivos neste formato.

  homevendas-12.Jul.2006.tar.gz
  homezago-12.Jul.2006.tar.gz

Multi volume, dividir arquivo

Gravar CD ou DVD tem suas limitações de tamanho, arquivos grandes que excedem a capacidade da mídia, precisa dividir em pedaços conforme a capacidade da mídia, tem diversas soluções para resolver este problema.

Na minha opinião o melhor é montar script de forma a criar os .tar.gz dentro do limite da mídia, compactar por tipo de arquivo, diretório, usuário ou outra forma que facilite na restauração, procure neste documento as opções com listagem em arquivo, exclusão de arquivos e diretórios e etc... Procure fazer de forma que na recuperação de um arquivo não force o uso de um grande conjunto de CD/DVD, um arquivão dividido em vários CD/DVD corre risco maior, danificando um CD pode comprometer todos, estude a melhor forma de backup, como restaurar e identificar arquivos de maneira mais rápida e segura. O que parece fácil agora pode se tornar um problemão depois.

Multi-volume do tar, no (man tar) tem esta informação.

  -M, --multi-volume
         cria/lista/extrai arquivos multivolumes

Não consegui compactar com multi-volume, usar -z e -M na mesma linha de comando, depois de dezenas de tentativas desisti desta opção, tem as alternativas de compactar e dividir com split, compactar para depois dividir com -M, não achei produtivo fazer em duas etapas, embora seja uma solução segura e prática quando automatizada via scripts. Resolvi o problema do cliente com troca do gravador de CD por um gravador de DVD.

Para eventual uso futuro, pretendo testar com DVDR/W para gravar em DVD da mesma forma que grava em disquete (floppy), nem sei se isto é possível. Coloquei aqui esta copia parcial do script, removi as partes de testes e alterei o nome da empresa por uma ISO de DVD do SUSE, criar tar em partes de 700MB para gravar em CD, o exemplo a seguir fica mais fácil e pratico trabalhar com split, aqui tem a finalidade de mostrar o uso de multi-volume com tar, ajuste a seu modo e se preferir inclua as opções de passar por parametros; tamanho, nome das partes e diretório de backup.

du /home/zago/SUSE-Linux-10.1-GM-DVD-i386.iso

3665416 SUSE-Linux-10.1-GM-DVD-i386.iso

Pegar tamanho total de arquivo ou diretório

MTOTAL=$(du /home/zago/SUSE-Linux-10.1-GM-DVD-i386.iso | awk '{print $1}')

echo $MTOTAL

3665416

Definir tamanho das partes

MPARTE=700000

descobrir quantos volumes deve criar.

MQTDEARQ=`echo "$MTOTAL/$MPARTE" | bc`

MQTDEARQ=`expr $MQTDEARQ + 1`

Montar variável nomeando as partes do arquivo.

  for i in $(seq 1 $MQTDEARQ)
  do
  MVAR=$MVAR$(printf " -f parte-0$i")
  done

Tem que nomear as partes e indicar -f de file para cada uma, exemplo de como deve ficar o comando tar para dividir em 6 partes, a quantidade de partes depende do resultado do tamanho total pelo de cada parte, some mais uma parte porque o "bc" retorna inteiro, portanto precisa de mais uma parte para eventual resto da divisão, não tem problema criar este arquivo a mais, se não for necessário ele será ignorado.

Pode fazer via script ou montar a linha de comando na não, o script que vem logo a seguir serve para monta esta linha de comando.

  tar -c -M -L 700000 -f parte-01.tar -f part-02.tar -f part-03.tar -f part-04.tar -f part-05.tar -f part-06.tar /home/zago/SUSE-Linux-10.1-GM-DVD-i386.iso

Montando o script para criar a linha de comando de arquivos multi-volumes.

cat multivol.sh

  #!/bin/bash
  MTOTAL=$(du /home/zago/SUSE-Linux-10.1-GM-DVD-i386.iso | awk '{print $1}')
  MPARTE=700000
  MQTDEARQ=`echo "$MTOTAL/$MPARTE" | bc`
  MQTDEARQ=`expr $MQTDEARQ + 1`
  for i in $(seq 1 $MQTDEARQ)
  do
  MPARTES=$MPARTES$(printf " -f parte-0$i.tar")
  done
  tar -c -M -L $MPARTE $MPARTES /home/zago/SUSE-Linux-10.1-GM-DVD-i386.iso

Este script acima cria no diretório corrente os arquivos com tamanho e nomes especificados nas variáveis iniciais, parte-01.tar, part-02.tar ...., pode fazer via script ou montar a linha de comando na mão.

Gravar estas partes em CD/DVD, precisa criar a ISO e queimar a mídia.

Restaurar a partir de arquivos multi-volumes, não tentei recuperar direto do CD, o melhor é copiar todos os CD para um diretório local e executar outro script, pode pegar o numero total de arquivos no diretório como referencia do total de partes no script abaixo para criar os nomes das partes, depois de concluindo o tar ignora o restante.

cat mtarrestore.sh

  #!/bin/bash
  MQTDEARQ=`ls | wc -l`
  for i in $(seq 1 $MQTDEARQ)
  do
  MPARTES=$MPARTES$(printf " -f parte-0$i.tar")
  done
  echo $MPARTES
  tar -x -M $MPARTES

Onde $MPARTES contém as partes do tar, -f parte-01.tar -f parte-02.tar ...., pode fazer via script ou montar a linha de comando na mão, aliás, o script serve para montar a linha de comando com a variável contendo todos os nomes das partes precedidadas de -f.

Split

Split divide o arquivo conforme tamanho solicitado, crie o tar normalmente, crie o arquivão .tar e depois aplique o split para dividir o arquivo em pedaços do tamanho desejado que pode ser a capacidade de um disquete, CD ou DVD, estes pedaços pode criar ISO e gravar CD DVD, para recuperar precisa juntar os pedaços com cat para depois aplicar o tar no desempacotamento, acho esta forma mais trabalhosa mas é uma solução segura também.

Veja tutorial e FAQ especifico sobre Split
http://www.zago.eti.br/split.tt

Outros exemplos de linha de comando

  tar -c /dir_ou_arq_origiem |gzip > /arq_destino/arq-`date +%d%m%y`.tar.gz

Criar um arquivo compactado do diretorio /home/zago e gravar em /mnt/copia com o nome zago-datadecriação.tar.gz.

  tar -c /home/zago |gzip > /mnt/copia/zago-`date +%d%m%y`.tar.gz

o sinal que aparece em arq-`date +%d%m%y`.tar.gz é crase ou backquote (`) cuidado para não confundir com aspas simples ou quote (').

Tem um espaço entre "date +", com y minúsculo o ano tem dois dígitos com Y maiúsculo tem os quatro dígitos.

log do tar

tar não registra eventos em arquivo de log, pode redirecionar a saido do console para arquivo.

         -v, --verbose
                mostra a lista dos arquivos processados

Em scripts não precisa do (v), caso queira salvar as mensagens em arquivo, acrescente no final da linha de comando do tar ">> logtar.txt", sem as aspas, assim fica gravado no arquivo logtar.txt, redireciona as mensagens do console para este arquivo, depois é só analisar com um editor de texto, formato da linha de comando ou em script

  tar zcvf ssh`date +%d%m%y`.tar.gz  /home/zago/guiaz/ssh >> logtar.txt
  tar zcvf ssh`date +%d%m%y`.tar.gz  /home/zago/guiaz/ssh >> /tmp/logtar.txt

Execute o script com a opção -xv para exibir as linhas de comando, (bash -xv script.sh). Use linhas com echo para salvar ou exibir conteúdo de variáveis, comentários e mensagens em arquivo. Ttem mais dicas para depurar erros em script neste tutorial.
http://www.zago.eti.br/script/log-de-comandos.html

indicações

FAQ com mensagens da lista Linux-br
http://www.zago.eti.br/tar.txt

tar+ssh, uso para backup via rede, salvar em outra maquina da rede, dicas e exemplos em;
http://www.zago.eti.br/ssh/ssh.html

FAQ, dicas e indicação de tutorias sobre uso dos pacotes zip e suas variações, gzip, bzip, unzip, xzip, gnozip e etc....
http://www.zago.eti.br/zip.txt

FAQ sobre backup em geral.
http://www.zago.eti.br/backup.txt

Fita DAT, uso do tar em fita DAT, FAQ especifico em:
http://www.zago.eti.br/fitadat.txt
Manual do tar (inglês)
http://www.gnu.org/software/tar/manual/tar.html
Página principal deste site (FAQ)
http://www.zago.eti.br/menu.html