Perl脚本中的自动化

时间:2011-07-15 23:46:16

标签: perl scripting

我正在运行一个perl脚本。在我的perl脚本中,我检查当前日期和文件夹名称(也是日期格式,例如11-12-07)。当它使用文件夹名称检查curent日期时,此perl脚本会自动运行。该文件夹是从其他服务器加载的tar文件夹。

所以,基本上我需要运行脚本,如果它与文件夹名称和当前日期匹配。

问题:有时,我曾经在第二天获取该文件夹,而我的perl脚本仅检查当前日期。我得到的文件夹的名称是前一个日期(不是当前日期)。所以,我需要手动处理文件夹。我需要在perl脚本中自动化它。

请告诉我一些想法,以实现它。

谢谢!

参考代码:

my $tfilename = 'tarmd5.tar';
my $td = `date '+%y-%m-%d'`;    # date in yy-mm-dd format
chomp ($td);
my $td2 = `date '+%Y%m%d'`;     # date in yyyymmdd format
chomp ($td2);


#
# get directory from command line
$dir = shift;
leave("'$dir' is not a valid directory") unless (-d $dir);
if    ($dir eq '.') {$dir = cwd();}
elsif ($dir !~ /^\//) {$dir = cwd()."/$dir";}


# print out the time
print scalar(localtime()),"\n";


######## This section unpacks transferred data ########
# go to directory for today and find *tar.gz files to copy

my $dday = "$dir/$td";
next unless (-d "$dday");
@gzfiles = glob("$dday/*tar.gz");
foreach $zf(@gzfiles) {
  next if (($zf =~ /BMP/) || ($zf =~ /LG/) || ($zf =~ /MAP/) || ($zf =~ /STR/));
  print "$zf\n";
  ($status,$message) = systemcall("/bin/cp $zf $fdir");
}

3 个答案:

答案 0 :(得分:2)

也许使用DateTime来做数学运算。我重写了解决方案,因为第一个写得不好。已将DateTime->today更改为DateTime->now,因为在转换回所需时区时(从“浮动”或“UTC”)需要hms部分。 还使用了Perl函数而不是shelling到Unix系统,(日期函数,当前工作目录 - cwd和复制函数)。

更新:elsif ($dir != /^\//)不正确。已更改为elsif ($dir !~ /^\//)

#!/usr/bin/perl
use strict;
use warnings;
use Cwd;
use DateTime;
use File::Copy;

# set to your desired time zone
my $today = DateTime->now( time_zone => "America/New_York" );
my $td = $today->strftime("%y-%m-%d");

# strongly recommended to do date math in the 'floating'/UTC zone
my $yesterday = $today->set_time_zone('floating')->subtract( days => 1);
my $yd = $yesterday->set_time_zone('America/New_York')->strftime("%y-%m-%d");

my $dir = shift or die "Provide path on command line. $!";

if ($dir eq '.') {
    $dir = cwd;
}
elsif ($dir !~ /^\//) {
    $dir = cwd() . "/$dir"; 
}

opendir my $dh, $dir or die $!;
my @dir = sort grep {-d and /$td/ || /$yd/} readdir $dh;
closedir $dh or die $!;
@dir or die "Found no date directories. $!";

my $dday = "$dir/$dir[-1]"; # is today unless today not found, then yesterday
my $fdir = '/some/example/path/';    
my @gzfiles = glob("$dday/*tar.gz");

foreach my $zf (@gzfiles) {  
    next if (($zf =~ /BMP/) || ($zf =~ /LG/) || ($zf =~ /MAP/) || ($zf =~ /STR/)); 
    print "$zf\n";
    copy($zf, $fdir) or die "Unable to copy. $!";
}

答案 1 :(得分:0)

因此,您希望获得与当天或之前几天匹配的所有目录名称?我假设你在完成处理后将目录移到其他地方。

一个好的起点是DateTime module。获取当前日期很简单:

    my $now = DateTime->now();

然后,您需要遍历所有目录并选择所需的日期。使用“perldoc -f”查找opendir(),readdir()和closedir()以获取目录。要匹配它们,请解析日/月/年,并创建另一个DateTime对象:

    my $dir_date = DateTime->new(
        day => $dir_day,
        month => $dir_month,
        year => $dir_year,
    );

将所有这些结合在一起后,查找给定目录是否如命中一样简单:

    processDir( $dir_name ) 
        if DateTime->compare( $now, $dir_date ) >= 0;

答案 2 :(得分:0)

我想知道使用bash脚本是否会更简单。如果我理解你想要做什么,那就是

  • 找到最近的.tar.gz文件,名称不包含“BMP”,“LG”等。
  • 将这些文件复制到另一个目录($ fdir,在您的示例中未定义)

也许您可以忽略整个文件夹名称问题,并搜索不超过24小时的文件?

dir=/your/bas/dir
fdir=/your/destination
find $dir -iname "*.tar.gz" -mtime -1 -not \( -name "*BMP*" -o -name "*LG*" -o -name "*MAP*" \) -exec cp "{}" "$fdir" \;