我正在运行一个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");
}
答案 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脚本是否会更简单。如果我理解你想要做什么,那就是
也许您可以忽略整个文件夹名称问题,并搜索不超过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" \;