Introdução
Você já precisou fazer backup de um diretório relativamente grande (ex: 50GB)? Se a gravação for feita em um DVD 4GB você teria que dividir esse diretório em várias partes e controlar manualmente quais arquivos já foram salvos. Essa tarefa entediante pode ser completamente evitada utilizando-se o comando dirsplit.
Esse comando recebe um diretório de entrada e o divide arquivos de imagem com um tamanho especificado no parâmetro. Assim, podemos facilmente gravar todo o diretório em vários DVD’s simplesmente queimando cada arquivo de imagem separadamente.
Hoje, aprenderemos como usar o comando dirsplit para resolver tarefas rotineiras de backup.
Baixando o dirsplit
Esse comando se encontra no pacote genisoimage. Para instalá-lo no Ubuntu [1], fazemos:
$ sudo apt-get -y install genisoimage
No Fedora:
$ sudo yum -y install dirsplit
Para outras distribuições, procure pelo pacote genisoimage.
Dividindo um diretório em arquivos de tamanho especificado
Suponha o seguinte diretório de teste:
$ du -h /home/daemonio/Musicas/MF_Doom 822M /home/daemonio/Musicas/MF_Doom
Imagine que eu queira gravá-lo em CD’s de tamanho aproximado de 700MB. Nesse caso, precisarei dividir esse diretório em imagens de 700MB cada e em seguida gravar cada uma delas em um CD. Usando o dirsplit, fazer essa divisão é muito fácil. Veja:
$ dirsplit -s 700MB /home/daemonio/Musicas/MF_Doom Building file list, please wait... Calculating, please wait... .................... Calculated, using 2 volumes. Wasted: 34421 Byte (estimated, check mkisofs -print-size ...) $ ls vol* vol_1.list vol_2.list
O comando criou dois arquivos .list também chamados arquivos de catálogo. Esses arquivos são do tipo texto e contém todos os arquivos do diretório original cujo tamanho total é menor ou igual ao valor dado no argumento.
A opção -s recebe o tamanho máximo que cada imagem irá ter, e se nada for especificado, o tamanho de um DVD (~ 4GB) será utilizado. Algo importante de se lembrar é que esse tamanho deve ser maior que o tamanho do maior arquivo do diretório, isto é, não faz sentido dividir um diretório em imagens de 700MB se dentro dele só há arquivos acima de 1GB, por exemplo.
O último passo é transformar os arquivos de catálogos em imagens ISO. Fazemos isso usando o comando mkisofs [2]:
$ mkisofs -o backup1.iso -D -r --joliet-long -V "BACKUP DISC1" -graft-points -path-list vol_1.list $ mkisofs -o backup2.iso -D -r --joliet-long -V "BACKUP DISC2" -graft-points -path-list vol_2.list
A opção -pat-list recebe um arquivo .list de entrada e a opção -o um arquivo .iso. Repare que temos que executar o mkisofs para todos os arquivos .list criados pelo dirsplit. Se há vários arquivos .list, podemos utilizar um loop para converter os arquivos de forma mais fácil [2]:
#!/bin/bash for i in `seq 1 5`; do mkisofs -o backup${i}.iso -D -r --joliet-long -V "BACKUP DISC${i}" -graft-points -path-list vol_${i}.list done
Onde 5 é a quantidade de arquivos .list. Para outros casos, altere esse valor.
Depois de tudo isso, no nosso exemplo, teremos duas imagens ISO no diretório atual:
$ ls back* /home/daemonio/backup1.iso /home/daemonio/backup2.iso
Agora basta usar seu gravador de CD’s favorito. Eu utilizo o K3B ;)
Criando diretórios e não arquivos .list [3]
Podemos criar diretórios ao invés dos arquivos de catálogo. Para isso, usamos a opção -l (link):
$ dirsplit -s 700MB -l /home/daemonio/Musicas/MF_Doom $ ls vol_1/ vol_2/ $ file vol_1/Operation_Doomsday/02-\ Doomsday.mp3 vol_1/Operation_Doomsday/02- Doomsday.mp3: symbolic link to `/home/daemonio/Musicas/MF_Doom/Operation_Doomsday/02- Doomsday.mp3'
Foram criados dois diretórios, vol_1 e vol_2. O interessante aqui é que os arquivos dentro desses diretórios são links que apontam para o arquivo original. Trocando a opção -l pela -m, ao invés de links, são os arquivos do diretório original que serão movidos para os diretórios criados pelo programa.
Usando filtros
O programa oferece a possibilidade de incluir e excluir determinados arquivos na lista final. Para isso, usamos os filtros através da opção -f:
$ dirsplit -f '/other\/Soundtrack/' -s 700M ~/diretorio
Irá incluir somente o diretório ~/diretorio/other/Soundtrack. O nome é relativo ao diretório original.
Usando o !, indicamos para o programa não incluir determinado arquivo que case com o filtro:
$ dirsplit -s 700M -f '!/Thumbs.db|Desktop.ini|\.m3u$/i' ~/diretorio
Exclui da lista final os arquivos Thumbs.db, Desktop.ini e todos aqueles com extensão .m3u. O ‘i’ no final é para ignorar a diferenciação de caixa.
Conclusão
O dirsplit é um comando pouco conhecido, mas com uma aplicação fantástica. Com ele, podemos dividir um diretório com vários arquivos em pequenas imagens que facilita bastante um eventual backup.
Referências
[1] Dirsplit – Dividindo arquivos em múltiplos volumes para gravação by Claudio Lobo (Acessado em: Novembro/2012)
http://claudioslobo.wordpress.com/2012/05/15/dirsplit-dividindo-arquivos-em-multiplos-volumes-para-gravacao/
[2] [one-liner]: Using the Linux Command, dirsplit, to Dynamically Backup a Directory Over Multiple DVDs by slmingol (Acessado em: Novembro/2012)
http://www.lamolabs.org/blog/8043/one-liner-using-the-linux-command-dirsplit-to-dynamically-backup-a-directory-over-multiple-dvds/
[3] Lesser known linux commands: dirsplit by Raman (Acessado em: Novembro/2012)
http://ramanchennai.wordpress.com/2009/09/21/lesser-known-linux-commands-dirsplit/
[4] dirsplit – Divisão de diretórios by Rubens Queiroz de Almeida (Acessado em: Novembro/2012)
http://www.dicas-l.com.br/arquivo/dirsplit_divisao_de_diretorios.php
[5] Splits directory into multiple with equal size for ISO burning purpose by NIXCRAFT (Acessado em: Novembro/2012)
http://www.cyberciti.biz/tips/splits-directory-into-multiple-with-equal-size-for-iso-burning-purpose.html