#!/usr/bin/perl #機能 # ディレクトリ同期コピー(コピー元と先を同じ状態にする) # コピー先に存在しないコピー元のファイル・ディレクトリをコピー先にコピーする。 # コピー元に存在しないコピー先のファイル・ディレクトリをコピー先から削除する。 # コピー先がCVS作業領域の場合、ディレクトリは削除しない(別途cvs updateで削除要)。 # コピー先に"CVS"というディレクトリが存在するばあい、CVS作業領域と判断する。 # "CVS"ディレクトリ内のファイルは削除しない。 # ピリオド"."で始まるファイルのコピー・削除は行わない。 # "~$"で始まるMS-WORDの作業ファイルコピー・削除は行わない。 # #使い方 # パラメータ1:オプション(D:試行,F:実行) # パラメータ2:ディレクトリ コピー元(フルパス) # パラメータ3:ディレクトリ コピー先(フルパス) #パラメータ取得 $option = $ARGV[0]; $cpfrom = $ARGV[1]; $cpto = $ARGV[2]; #パラメータチェック if (($option eq "D") or ($option eq "F")) {} else { print("parm1 is D or F. parm1=$option"); exit 8; } if (-d $cpfrom) {} else { print("parm2 is not directry. parm2=$cpfrom"); exit 8; } if (-d $cpto) {} else { print("parm3 is not directry. parm3=$cpto"); exit 8; } #コピー開始 print "Sync Copy start ==========\n"; copy ($cpfrom,$cpto); #削除開始 print "Sync Remove start ========\n"; remv ($cpfrom,$cpto); print "Sync Copy end ==========\n"; ########################## sub copy { my($cpfrom) = $_[0]; my($cpto) = $_[1]; my($filename) = ''; opendir(DIR,$cpfrom); foreach $filename ( sort(readdir(DIR)) ) { if (getSkipSt($filename) == 0) { } else { if (-d $cpfrom."/".$filename ) { if (-d $cpto."/".$filename ) { #コピー先ディレクトリ有りであれば、再帰呼び出し copy($cpfrom."/".$filename ,$cpto."/".$filename); } else { #コピー先ディレクトリ無しであれば、ディレクトリのみ作成し再帰呼び出し print "mkdir ".$cpto."/".$filename."\n"; if ($option eq "F") { $rcd = system ("mkdir",$cpto."/".$filename); if ( $rcd > 0 ) { print "SCC0001-E"," operation error rcd=",$rcd; } } copy($cpfrom."/".$filename ,$cpto."/".$filename); } } else { #コピー元情報取得 ($fromtime,$fromsize) = getFileInf($cpfrom."/".$filename); #コピー先情報取得 ($totime,$tosize) = getFileInf($cpto."/".$filename); if (($fromtime eq $totime) and ($fromsize eq $tosize)) { } else { print "#inf $fromtime $totime $fromsize $tosize \n"; #情報不一致の場合コピー print "cp -p ".$cpfrom."/".$filename." ".$cpto."/".$filename."\n"; if ($option eq "F") { $rcd = system ("cp","-p",$cpfrom."/".$filename,$cpto."/".$filename); if ( $rcd > 0 ) { print "SCC0002-E"," operation error rcd=",$rcd; } } } } } } return 0 ; } ########################## sub remv { my($cpfrom) = $_[0]; my($cpto) = $_[1]; my($filename) = ''; opendir(DIR,$cpto); foreach $filename ( sort(readdir(DIR)) ) { if (getSkipSt($filename) == 0) { } else { if (-d $cpto."/".$filename ) { if (-d $cpfrom."/".$filename ) { #コピー元ディレクトリ有りであれば、何もしない remv($cpfrom."/".$filename ,$cpto."/".$filename); } else { remv($cpfrom."/".$filename ,$cpto."/".$filename); #コピー元ディレクトリ無しであれば、全ファイル削除 #但し、コピー先がCVS作業領域の場合、ディレクトリは削除しない。 if (-d $cpto."/".$filename."/CVS") { } else { print "rm -rf ".$cpto."/".$filename."\n"; if ($option eq "F") { $rcd = system ("rm","-rf", $cpto."/".$filename); if ( $rcd > 0 ) { print "SCC0003-E","operation error rcd=",$rcd; } } } } } else { if (-f $cpfrom."/".$filename ) { #コピー元ファイル有りであれば、何もしない } else { #コピー元ファイル無しであれば、ファイル削除 print "rm -f ".$cpto."/".$filename."\n"; if ($option eq "F") { $rcd = system ("rm","-f", $cpto."/".$filename); if ( $rcd > 0 ) { print "SCC0004-E","operation error rcd=",$rcd; } } } } } } return 0 ; } ########################## sub getFileInf { my($filename) = @_; ($device,$inode,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime, $ctime,$blksize,$blocks) = stat($filename); # ($ss,$mm,$hh,$dd,$mo,$ye,$we,$dc,$st)=localtime($atime); # $atimew=sprintf("%04d%02d%02d%02d%02d%02d",$ye+1900,$mo+1,$dd,$hh,$mm,$ss); ($ss,$mm,$hh,$dd,$mo,$ye,$we,$dc,$st)=localtime($mtime); $mtimew=sprintf("%04d%02d%02d%02d%02d%02d",$ye+1900,$mo+1,$dd,$hh,$mm,$ss); # ($ss,$mm,$hh,$dd,$mo,$ye,$we,$dc,$st)=localtime($ctime); # $ctimew=sprintf("%04d%02d%02d%02d%02d%02d",$ye+1900,$mo+1,$dd,$hh,$mm,$ss); return $mtimew , $size ; } ########################## sub getSkipSt { my($filename) = @_; if ($filename =~/^\.+/) { return 0; } elsif ($filename =~/^CVS$/) { return 0; } elsif ($filename =~/^\~\$/) { return 0; } else { return 1; } } ##########################