【发布时间】:2011-07-21 08:02:55
【问题描述】:
在下面的 perl 脚本中,我用当前日期检查了我的文件夹名称(采用日期格式,如 11-08-31)。如果匹配,我会处理该文件夹。如果今天的日期没有文件夹,它还会检查前一天的文件夹。我已经在这里问过这类问题,但我需要在此处进行一些更改并添加新功能:
如果今天没有找到,脚本会检查上一个日期。但是我需要检查上一个日期是否已经被处理,这样我就不会再次处理它。那么,我需要为它创建一个列表吗?
此脚本仅检查前一个日期。如果我必须检查前两天的情况怎么办?谢谢你的帮助。希望你能理解我的疑惑。
更新:此 perl 脚本在检查当前日期和文件夹名称时自动运行。该文件夹是从其他服务器加载的tar文件夹。
所以,基本上我需要运行脚本,如果它与文件夹名称和当前日期匹配。
问题:有时,我曾经在第二天获取文件夹,而我的 perl 脚本仅检查当前日期。我得到的文件夹的名称是以前的日期(不是当前日期)。所以,我需要手动处理文件夹。我需要在我的 perl 脚本中自动化它
#!/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. $!";
}
【问题讨论】:
-
你为什么不抓住最新的可用文件夹并处理它?如果我没记错的话,这似乎是你正在尝试的。您还可以检查它的年龄是否在特定的天数范围内。
-
我想自动完成。我从其他站点获取目录中的文件夹,然后我需要处理它。但有时,文件夹会迟到一天。所以,我还需要检查上一个日期。
-
请检查问题中的更新部分。
-
但是您仍然只想处理最新的未处理文件夹吗?要在脚本运行之间跟踪已处理的文件夹,您可以使用纯文本文件或 Storable search.cpan.org/~ams/Storable-2.30/Storable.pm
-
是的。我需要处理最新的文件夹。但有时,您会在 1 天内获得 2 个文件夹,然后您需要同时处理这两个文件夹。因此,我还需要通过将前一个日期与文件夹名称相匹配来检查这些文件夹。在我的脚本中,我只检查今天的文件夹,如果它不存在,我检查前一个日期。我需要在我的脚本中强制检查两者,看看是否处理了前一个日期文件夹。
标签: perl