perl 学习 一个简单的数据
时间:2007-01-11 来源:roywangt
写了一个数据“备份”脚本,实现一个数据转移的功能,将文件按照月份/业务(可以分多级)/天进行数据存放,目前是按照每天处理一次的方式进行的。目标是按照文件生成时间进行数据分成分业务进行存放。
代码如下 :使用了perl一些简单的特性。觉得是我第一次写的比较好的perl程序。自我感觉而已了。
#!/usr/bin/perl
#use Time::localtime;
##################### SUB ##########################
sub backupdata{
my @tmpPath = @_;
my $dayPath = $tmpPath[2];
print $tmpPath[0] , $tmpPath[1] ,"\n" ;
opendir dire , $tmpPath[0] or die "opendir is error \n";
while ( defined ($filename = readdir(dire)) ) {
next if $filename eq "." ;
next if $filename eq ".." ;
next if -d $tmpPath[0].$filename ;
if ($tmpPath[3] eq "1") {
system "mv", $tmpPath[0].$filename , $tmpPath[1].$filename ;
print "1=".$tmpPath[0].$filename."==".$tmpPath[1].$filename."\n";
next ;
}
if ($tmpPath[3] eq "2") {
mkdir $tmpPath[1].$dayPath,0755 if !-e $tmpPath[1].$dayPath ;
print "2=".$tmpPath[0].$filename."==".$tmpPath[1].$dayPath."/".$filename."\n";
system "mv", $tmpPath[0].$filename , $tmpPath[1].$dayPath."/".$filename ;
next ;
}
}
closedir(dire);
}
sub buildPath{
my @Paths = split /\//,$_[1];
chdir $_[0] ;
foreach $Path(@Paths) {
mkdir $Path,0755 if !-e $Path ;
chdir $Path ;
}
}
##################### ENV ##########################
%BusiPath = (
"recv/17901" =>"1", "recv/4008" =>"1", "recv/DddSta" =>"2", "recv/SmsSta" =>"2",
"recv/hyt" =>"1", "recv/nv" =>"1", "recv/QCFromProv" =>"1", "recv/iep" =>"1",
"recv/infodata" =>"1", "recv/ngn" =>"1","recv/other" =>"1", "recv/smc" =>"1",
"recv/SettleSta" =>"2", "recv/hkrx" =>"1","recv/ipass" =>"1", "recv/ptm"=>"1",
"recv/datum/radius" =>"1","recv/datum/vpdn" =>"1", "recv/datum/card" =>"1", "recv/in/smp"=>"1",
"send/17901" =>"1", "send/4008" => "1", "send/hyt" => "1" ,
"send/iep" =>"1", "send/in" =>"1", "send/ngn" =>"1", "send/nv" =>"1", "send/sms" =>"1"
);
my $DesPath ;
my $workPath ;
my $SubPath =` date +"%Y%m" `;
my $DayPath =` date +"%Y%m%d" `;
chomp $SubPath; chomp $DayPath ;
my $MainPath = "/appdatabak/";
my $SourceMainPath = "/jsdata/settle/data/province/appdatabak/";
my $tm = localtime;
##################### WORK ##########################
mkdir $MainPath.$SubPath,0755 if !-e $MainPath.$SubPath ; #check subPath
foreach $key(keys%BusiPath) {
buildPath($MainPath.$SubPath , $key);
$DesPath = $MainPath.$SubPath."/".$key."/";
print "DES=".$DesPath."\n";
backupdata($SourceMainPath.$key."/" , $DesPath, $DayPath,$BusiPath{$key} );
} 修改了以前的错误。在不同的unix、perl版本上,mkdir 有一定的差异。
#use Time::localtime;
##################### SUB ##########################
sub backupdata{
my @tmpPath = @_;
my $dayPath = $tmpPath[2];
print $tmpPath[0] , $tmpPath[1] ,"\n" ;
opendir dire , $tmpPath[0] or die "opendir is error \n";
while ( defined ($filename = readdir(dire)) ) {
next if $filename eq "." ;
next if $filename eq ".." ;
next if -d $tmpPath[0].$filename ;
if ($tmpPath[3] eq "1") {
system "mv", $tmpPath[0].$filename , $tmpPath[1].$filename ;
print "1=".$tmpPath[0].$filename."==".$tmpPath[1].$filename."\n";
next ;
}
if ($tmpPath[3] eq "2") {
mkdir $tmpPath[1].$dayPath,0755 if !-e $tmpPath[1].$dayPath ;
print "2=".$tmpPath[0].$filename."==".$tmpPath[1].$dayPath."/".$filename."\n";
system "mv", $tmpPath[0].$filename , $tmpPath[1].$dayPath."/".$filename ;
next ;
}
}
closedir(dire);
}
sub buildPath{
my @Paths = split /\//,$_[1];
chdir $_[0] ;
foreach $Path(@Paths) {
mkdir $Path,0755 if !-e $Path ;
chdir $Path ;
}
}
##################### ENV ##########################
%BusiPath = (
"recv/17901" =>"1", "recv/4008" =>"1", "recv/DddSta" =>"2", "recv/SmsSta" =>"2",
"recv/hyt" =>"1", "recv/nv" =>"1", "recv/QCFromProv" =>"1", "recv/iep" =>"1",
"recv/infodata" =>"1", "recv/ngn" =>"1","recv/other" =>"1", "recv/smc" =>"1",
"recv/SettleSta" =>"2", "recv/hkrx" =>"1","recv/ipass" =>"1", "recv/ptm"=>"1",
"recv/datum/radius" =>"1","recv/datum/vpdn" =>"1", "recv/datum/card" =>"1", "recv/in/smp"=>"1",
"send/17901" =>"1", "send/4008" => "1", "send/hyt" => "1" ,
"send/iep" =>"1", "send/in" =>"1", "send/ngn" =>"1", "send/nv" =>"1", "send/sms" =>"1"
);
my $DesPath ;
my $workPath ;
my $SubPath =` date +"%Y%m" `;
my $DayPath =` date +"%Y%m%d" `;
chomp $SubPath; chomp $DayPath ;
my $MainPath = "/appdatabak/";
my $SourceMainPath = "/jsdata/settle/data/province/appdatabak/";
my $tm = localtime;
##################### WORK ##########################
mkdir $MainPath.$SubPath,0755 if !-e $MainPath.$SubPath ; #check subPath
foreach $key(keys%BusiPath) {
buildPath($MainPath.$SubPath , $key);
$DesPath = $MainPath.$SubPath."/".$key."/";
print "DES=".$DesPath."\n";
backupdata($SourceMainPath.$key."/" , $DesPath, $DayPath,$BusiPath{$key} );
} 修改了以前的错误。在不同的unix、perl版本上,mkdir 有一定的差异。
相关阅读 更多 +