【问题标题】:Automation in Perl scriptPerl 脚本中的自动化
【发布时间】:2011-10-03 07:40:59
【问题描述】:

我正在运行一个 perl 脚本。在我的 perl 脚本中,我检查当前日期和文件夹名称(它也是日期格式,例如 11-12-07)。此 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");
}

【问题讨论】:

  • 如果我的理解是正确的,您想为匹配当前日期或未来日期的所有日期运行脚本吗?
  • 实际上,我需要检查当前日期以及上一个日期。因为如果来晚了我会错过数据。
  • 文件夹带有原始日期(当前日期或前一个日期)。如果它带有以前的日期,我会丢失数据,因为我的 perl 脚本只匹配当前日期。
  • 嗨。请注意,我在代码中发现了一个错误并修复了它。 elsif ($dir != /^\//) 不正确。应该是 elsif ($dir !~ /^\//)
  • 我使用的是以前的脚本,它显示“ elsif ($dir != /^\//) ”没有问题。无论如何,我没有什么疑问,并在评论部分发布。

标签: perl scripting


【解决方案1】:

也许使用DateTime 来计算。我重新编写了解决方案,因为第一个写得不好。将DateTime->today 更改为DateTime->now,因为在转换回所需时区(从“浮动”或“UTC”)时需要 hms 部分。 还使用 Perl 函数,而不是向 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. 如果今天没有找到,脚本会检查上一个日期。但是我需要检查上一个日期是否已经处理,这样我就不会再次处理它。 2. 此脚本仅检查前一个日期。如果我必须检查前两天的情况怎么办?谢谢你的帮助。希望你能理解我的疑惑。
【解决方案2】:

所以您想获取与当前日期或任何前几天匹配的所有目录名称?我假设您在处理完目录后将它们移动到其他地方。

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;

【讨论】:

  • 感谢您的解决方案,但我的主要目的是选择文件夹。如果文件夹按时到达我的目录,则文件夹的名称可以是“当前日期”,如果到达第二天,则可以是上一个日期(=当前日期的值)。在第二种情况下,我丢失了数据,因为它不匹配,我必须手动完成。
【解决方案3】:

我想知道使用 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" \;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2015-06-10
    • 2013-08-16
    • 2016-12-02
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多