Let's write β

プログラミング中にできたことか、思ったこととか

Debian GNU/Linux インストール日記(12) バックアップツールの自作

バックアップってのは面倒な物です。でもしておかないと大変になりますし、手作業でやるとわすれがちです。でも、セーブしておきたいファイルの場所は一回ぐらいなら覚えてるんじゃないでしょうか。そんなときにちょこっと設定ファイルに記述するだけでバックアップ対象にできたら嬉しいですよね。というわけでperlで自作しました。

use strict;
use warnings;
use Getopt::Long;
use File::Copy;
use File::Copy::Recursive qw(rcopy);
use File::Temp;
use File::HomeDir;
use Archive::Zip;
use Cwd;

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon += 1;
my $outfile = "backup$year$mon$mday$hour$min$sec.zip";

# GetOptions
GetOptions("outfile=s" => \$outfile);

# get home dir path 
my $home = File::HomeDir->my_home;
# set rc filename
my $rcFile = $home . "/.myBackuprc";
# check rc file exist
unless(-f $rcFile) {
	die "Error: Can't find rc file";
}
# ead data from rc file
# nd save data to haskmap
my %backupHash;
open(IN, $rcFile);
while(my $line = <IN>) {
	if($line =~ /([a-zA-Z0-9]*): ([^\s]*)/) {
		$backupHash{"$1"} = "$2";
	}
}

# heck hash map
while((my $key, my $val) = each(%backupHash)) {
	unless(-e $val) {
		print "Warn: $val does not exist!!\n";
		delete $backupHash{"$key"};
	}
	else {
		print "Backup name: $key Path: $val\n";
	}
}

# enerate temp dir
my $currentDir = getcwd;
my $tempDir = File::Temp::tempdir(DIR=>'.', CLEANUP => 1);
my $tempDirFullPath = $currentDir . "/$tempDir";
# nto temp dir

chdir($tempDirFullPath);
while((my $key, my $val) = each(%backupHash)) {
	rcopy("$val", "$key");
}

# enerate tgz
my $zip = Archive::Zip->new;
$zip->addTree("$tempDirFullPath");
# et out from temp dir
chdir($tempDirFullPath . "/../");
$zip->writeToFileNamed("$outfile");

こんな感じです。
まずは動作の説明について、このプログラムは実行者のホームディレクトリ下にある.myBackuprcというファイルをさがします。そのファイルが存在しなければ終了、存在すればそのファイルからバックアップ対象のファイルを読みこみ、"backup年月日時分秒.zip"な形式のバックアップZIPを保存します。一応oufile名の指定方法もありますので、こちらにpathを渡してやればそちらに作成したりもします。



そして設定ファイルの記述形式ですが、いたってシンプルです。

BackupName: FileOrFolderPath
BackupName: FileOrFolderPath
.....
....続く

といった形式です。$FileOrFolderPathのファイルやフォルダが$BackupNameの名前でzip内に保存されます。これはドットファイルなどの隠しファイルをバックアップ時に名前変更したら楽だと思ったためです。たとえば

dotVimrc: /home/pocket/.vimrc
dotEmacsrc: /home/pocket/.emacs
VimDir: /home/pocket/.vim

とか書いてやるとそれぞれ.vimrcはdotVimrcの名前で...等の様に保存されるというわけです。



これでバックアップが簡単にとれるようになりました。。一安心です。
それではHappy hacking!!