Задать вопрос

Нужна помощь с perl. Как правильно сделать?

Всех приветствую!
Условие:
есть некоторое количество файлов в директории /tmp/src_dir:
file1
file2
file3
...
ежедневно эти файли копирутся в директорию /tmp/dst_dir и в имя файла добавляется дата копирования файла в формате YYYY-MM-DD:
...
file1-2014-06-10
file2-2014-06-10
file3-2014-06-10
...
Задача:
написать на Perl скрипт, который при запуске будет проверять был ли скопирован файл в /tmp/dst_dir за менувшие сутки.
Например, сегодня 2014-06-23, значит для каждого файла, который существует в /tmp/src_dir должен быть файл, который находиться в /tmp/dst_dir/:
file1-2014-06-22
file2-2014-06-22
file3-2014-06-22
Если какой-то файл\файлы не был скопирован, то на вывод скрипт должен выдать имя отстутвующего файла\файлов.
Важный нюанс:
функцию opendir() использовать нельзя. Состав обеих директорий можно получить только с помощью команды ls.
Т.е, как я понимаю, нужно присвоить массиву что-то типа:
my @src_dir=`ls /tmp/src_dir`

Даже не знаю с какой стороны подойти к этой задаче. Буду благодарен любой помощи!
  • Вопрос задан
  • 2570 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
Slipeer
@Slipeer
Для каждого файла примерно такая проверка.
use POSIX qw/strftime/;
#Вчерашняя дата в нужном формате
my $date = strftime('%Y-%m-%d',localtime(time-86400));
my $filepath = "/tmp/dst_dir/file1-$date";                                                                                                                                        
if ! (open $fh, '<', $filepath) {
 #Копии файла нет
 # как нравится
};
croak $EVAL_ERROR if !close $fh;
Ответ написан
Комментировать
@johny69 Автор вопроса
Slipeer, спасибо за предложенный вариант, но у меня в условии есть нюанс: список файлов в директориях можно получить только через вызов внешнего ls.
my @src_dir=`ls /tmp/src_dir`
my @dst_dir=`ls /tmp/dst_dir`


Т.е. как я понимаю, необходимо проверить есть ли для каждой строки из my @src_dir такая же строка в my @dst_dir,но с my $date в конце имени файла.
Как бы это реализовать?
Ответ написан
Можно так:

#!/usr/bin/perl
use strict;
use warnings;

use POSIX qw/strftime/;

my $src_dir = $ARGV[0];
my $dst_dir = $ARGV[1];

my $yesterday = strftime("%Y-%m-%d", localtime(time-86400));

my @src_files = split /\s+/, `ls $src_dir`;

for my $sf (@src_files){
    my $df = "$dst_dir/$sf-$yesterday";
    if ( ! -f $df  ){
        print "$df\n";
    }
}


Вызывать так:
check_backup.pl /tmp/src_dir /tmp/dst_dir

Если высокие требования к надежности скрипта -- стоит аккуратнее вызывать внешний ls (проверять, что он не упал).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы