perl找出一个目录下指定日期的文件,感兴趣的朋友可以参考下。
一、需求
目录名:/opt/etl_data/log/standlog
该目录下有日期目录:
/opt/etl_data/log/standlog/2012-10-22
/opt/etl_data/log/standlog/2012-10-23
/opt/etl_data/log/standlog/2012-10-24
.....
每个日期目录下有相应的日期文件:
/opt/etl_data/log/standlog/2012-10-22/20121022
/opt/etl_data/log/standlog/2012-10-23/20121023
/opt/etl_data/log/standlog/2012-10-24/20121024
.....
现要通过一个子程序实现将上述的日期文件找出来。
实现方法:
复制代码 代码如下:
sub product_filename{
my ($dir)=@_;
my (@datename,@list,$date);
opendir DIR,$dir or die "Cann't open the $dir";
@list=readdir DIR or die;
for my $file (@list){
next if $file =~ /./;
next if $file =~ /../;
push @datename,$file;
}
my ($dirname,@dirlist);
for my $listdir (@datename){
$dirname=$dir."/".$listdir;
push @dirlist,$dirname;
}
my ($filename,$time,@filenames);
for (@dirlist){
$time = "$1$2$3" if /(d+)-(d+)-(d+)$/;
$filename = $_."/".$time;
push @filenames,$filename;
}
return @filenames;
}
参数传递:
复制代码 代码如下:
my $dir="/opt/etl_data/log/standlog";
my @datelist=&product_filename($dir);
二、 需求
现要针对这些文件作一些比对,根据我所要输入的日期时间段,找出对应的文件。
比如,我输入20121001 20121031,会打印出这个时间段的日期文件。
该子程序实现为:
复制代码 代码如下:
sub file_compare{
my ($filetime,@filenames)=@_;
my (%times);
for (@filenames){
$times{$_}="$1" if /(d+)$/;
}
for my $key (keys %times){
if ($filetime eq $times{$key}){
return $key;
}
}
}
file_compare子程序是将文件名作为键,文件名的最后一段日期作为值,存入%times散列表。
然后将传入的$filetime与%times散列表中的值进行比对,如果相同,返回文件名。