Это решение находит все каталоги, которые еще должны быть обработаны, которые новее, чем самая последняя обработанная дата директории. Вы сделали запись вручную в первый раз (до запуска скрипта). Сценарий обновит его с этого момента.
Файл может быть назван как my $last = 'dir_last.dat';
Я только что ввел файл в командной строке, как:
C:\Old_Data\perlp>echo 11-07-14 > dir_last.bat
C:\Old_Data\perlp>type dir_last.bat
11-07-14
C:\Old_Data\perlp>
Предполагается, что самым новым каталогом был 11-07-14
. Вы должны выяснить это сами, прежде чем запускать скрипт.
#!/usr/bin/perl
use strict;
use warnings;
use File::Copy;
my $dir = shift or die "Provide path on command line. $!";
my $last = 'dir_last.dat';
open my $fh, "<", $last or die "Unable to open $last $!";
chomp(my $last_proc = <$fh>);
close $fh or die "Unable to close $last $!";
opendir my $dh, $dir or die "Opening failed for directory $dir $!";
my @dir = sort grep {-d && /^\d\d-\d\d-\d\d$/ && $_ gt $last_proc} readdir $dh;
closedir $dh or die "Unable to close $dir $!";
@dir or die "Found no date directories after last update: $last_proc";
my $fdir = '/some/example/path';
for my $date (@dir) {
my $dday = "$dir/$date";
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 $zf to $fdir. $!";
}
}
open $fh, ">", $last or die "Unable to open $last $!";
print $fh "$dir[-1]\n"; # record the newest date-directory as processed
close $fh or die "Unable to close $last $!";
Обратите внимание, что я не полагался на cwd
, как первый сценарий. Это действительно не было нужно там и не нужно здесь. opendir
, glob
и copy
все могут обрабатывать каталог точек (cwd) и относительные пути.
Заголовок содержит строки use strict;
и use warnings;
. Их цель - предупредить вас об ошибках в вашем коде (большинство сценариев perl должны использовать их, если только эксперт не решит их исключить - по какой причине я не знаю). Первая строка сообщает unix, где найти интерпретатор (perl).