Автоматизация в Perl скрипте - PullRequest
1 голос
/ 16 июля 2011

Я использую 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");
}

Ответы [ 3 ]

2 голосов
/ 16 июля 2011

Может быть, использовать 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. $!";
}
0 голосов
/ 03 октября 2011

Интересно, не было бы проще с bash-скриптом?Если я понимаю, что вы пытаетесь сделать, это

  • найти последние файлы .tar.gz, имена которых не содержат "BMP", "LG" и т. Д.
  • copyэти файлы в другой каталог ($ 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" \;
0 голосов
/ 16 июля 2011

То есть вы хотите получить все имена каталогов, которые соответствуют текущему или любым предыдущим дням?Я предполагаю, что вы переместите каталоги куда-нибудь еще, когда они будут обработаны.

Хорошее место для начала - модуль DateTime .Получить текущую дату достаточно просто:

    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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...