Всех приветствую! Условие:
есть некоторое количество файлов в директории /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`
Даже не знаю с какой стороны подойти к этой задаче. Буду благодарен любой помощи!
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;
Slipeer, спасибо за предложенный вариант, но у меня в условии есть нюанс: список файлов в директориях можно получить только через вызов внешнего ls.
my @src_dir=`ls /tmp/src_dir`
my @dst_dir=`ls /tmp/dst_dir`
Т.е. как я понимаю, необходимо проверить есть ли для каждой строки из my @src_dir такая же строка в my @dst_dir,но с my $date в конце имени файла.
Как бы это реализовать?
@johny69 не понял зачем Вам список файлов. Я предложил проверять наличие файла просто его открытием. Вот вариант с ls:
use POSIX qw/strftime/;
#Вчерашняя дата в нужном формате
my $date = strftime('%Y-%m-%d',localtime(time-86400));
my $dst_dir=`ls /tmp/dst_dir`
my @filename = ("file1","file2","file3");
my $filepath;
foreach (@filename) {
my $file = $_-$date"; if ($dst_dir !~ m/$file/i) {
#Копии файла нет
#Уведомляйте как нравится
};
};
@Slipeer Я, возможно, не тривиально указал, что в src_dir могут быть файлы с абсолютно любыми именами, но они все ежедневно копируются в dst_dir. Поэтому чтобы узнать есть ли копия файла нужно сначала узнать существует ли файл в src_dir вообще. Я так понимаю алгоритм. Поменял на my @filename=`ls /tmp/src_dir` , но скрипт не работает. (
#!/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";
}
}