dirsplit: Dividindo Diretórios Com Finalidade De Backup

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

Deixe um comentário