差分FTPを考える(5 – 組み込み
ここまで出来たら、もとのFTPプログラムに組み込みました。
#!/usr/bin/perl use strict; use Net::FTP; use Storable qw(nstore retrieve); use Cwd; my $cwd = getcwd(); # 引数を読み取る if ($#ARGV ne 4 ){ print "引数が誤っています。\n"; print "$0 [hostname] [user] [password] [fromdir] [todir]\n"; exit 1; } my $hostname=$ARGV[0]; my $user =$ARGV[1]; my $password=$ARGV[2]; my $from =$ARGV[3]; my $to =$ARGV[4]; my $from_dir =`dirname $from`; my $from_base=`basename $from`; my $ret; chomp $from_base; chomp $from_dir; # 前回の状態を読み込む #----- conf -------- my $bdata='before.dat'; #------------------- #### Read ########################### my %btmp; if ( -f $bdata ){ %btmp=%{ retrieve(${bdata}) }; } ##################################### # 転送予定のフォルダのリストを取る my $ret=chdir("$from"); my %ftmp; open (FNAME,qq(find . -type f|)); while (<FNAME>){ chomp; my $dn=`dirname $_`; my $fn=`basename $_`; chomp($dn); chomp($fn); my $cksum=`cksum $_`; my @cksums=split( " " , $cksum ); $ftmp{$_} = qq($cksums[0],$cksums[1]); } # 接続 my $ftp= Net::FTP->new(qq($hostname), Debug => 0); $ftp->login($user , $password ); $ftp->binary(); $ret=$ftp->cwd($to ); if($ret eq ''){ print qq(cwd error \[$to\]\n); exit 1; } # ディレクトリをfindで検索してput先にmkdirする。 open (DIRNAME,qq(/usr/bin/find . -type d|)); while (<DIRNAME>){ chomp; $ftp->mkdir($_); } close DIRNAME; # ファイルをfindで検索してput先にputする。 open (FNAME,qq(/usr/bin/find . -type f|)); while (<FNAME>){ chomp; # 前回と同じかどうかをチェック if ( $btmp{$_} eq $ftmp{$_} ){ next; } my $dn=`dirname $_`; my $fn=`basename $_`; chomp($dn); chomp($fn); $ftp->cwd($dn); if($ret eq ''){ print qq(cwd error \[$dn\]\n); exit 1; } print &getdate . qq( [put] $_\n); $ret=$ftp->put($_); if($ret eq ''){ print qq(put error \[$_\]\n); exit 1; } $ftp->cwd($to); } close FNAME; #### Write ########################## chdir $cwd; nstore \%ftmp , $bdata; ##################################### sub getdate{ my ($sec,$min,$hh,$dd,$mm,$yy,$weak,$yday,$opt) = localtime(time); #my $t="$yy/$mm/$dd $hh:$min:$sec"; my $t=sprintf("%04d/%02d/%02d %02d:%02d:%02d",$yy+1900,$mm+1,$dd,$hh,$min,$sec); return $t; } 1;
ファイル情報はハッシュに詰めています。
%btmpが前回のファイル情報、%ftmpが現在のファイル情報です。
キーがファイルパスで、値にチェックサム値を入れています。
%btmpはbefore.datから読み込んで、全てが正常に終わったら%ftmpに上書きしています。
こうして常に前回の情報が保存されるようにしています。
ファイルの変化を確かめるためにcksumコマンドで確認しています。
$ cksum test.dat 3517503372 127 test.dat
チェックサム値 ファイルサイズ ファイル名
という表記になっています。
チェックサム値だけでも良いのですが、"3517503372,127″のようにカンマでつなげて精度を高めています。
とは言え、実際には単にファイルが変わったかどうかを知りたいだけなので、チェックサム値だけで十分だと思います。
ディスカッション
コメント一覧
まだ、コメントがありません