Всех приветствую!
Условие:
есть некоторое количество файлов в директории /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`
Даже не знаю с какой стороны подойти к этой задаче. Буду благодарен любой помощи!
> Даже не знаю с какой стороны подойтиCпереди!
>> Даже не знаю с какой стороны подойти
> Cпереди!Ну кто же нынче воюет в двубортых! Подходи сзади конечно! И ВНЕЗАПНО!
а чо сессия еще не кончилась?
> а чо сессия еще не кончилась?Ну, мало ли. Пересдача, собеседование, ...
> Даже не знаю с какой стороны подойти к этой задаче. Буду благодарен
> любой помощи!А да пожалуйста, а да на здоровье!
#!/usr/bin/perluse strict;
use warnings;
use POSIX;
my $srcd = "/tmp/src_dir";
my $dstd = "/tmp/dst_dir";my $yesterday = strftime "%F", localtime(time-86400);
my @src;
open SRC, "-|", "ls $srcd";
while(<SRC>) {
chomp;
push @src, $_ if /$yesterday/;
}
close SRC;
my @dst;
open DST, "-|", "ls $dstd";
while(<DST>) {
chomp;
push @dst, $_ if /$yesterday/;
}
close DST;my %seen;
foreach my $file (@dst) {$seen{$file} = 1}
foreach my $file (@src) {
unless ($seen{$file}) {
print "File $file not found!\n";
}
}http://www.inter-activ.ru/cgi-bin/texts.cgi?m=m24
ну и рекомендую "Perl. Сборник рецептов. Для профессионалов авторы Кристиансен Т. Торкингтон Н."
и будет понятно "с какой стороны подходить"
>[оверквотинг удален]
> foreach my $file (@src) {
> unless ($seen{$file}) {
> print "File $file not
> found!\n";
> }
> }
От души, Михалыч!Но это, пожалуй, очень сложное решение для меня. И почему-то не работает скрипт.
Имею в /tmp/src_dir следующее:johny@lab:~$ ls /tmp/src_dir/
file1 file2 file3 file4
А в /tmp/dst_dir:johny@lab:~$ ls /tmp/dst_dir/
file1-2014-06-23 file2-2014-06-22
Т.е. скрипт на выходе должен выдать,что файлы file2 file3 file4 нот фаунд,но он молчаливо выполняется,exit код "0".
У меня изначально была идея попроще:
-загнать обе диреткории в массивы через вызов внешнего ls
-затем проверить есть ли каждая строка из @src_dir в @dst_dir с таким окончанием "-$yesterday".
Но не знаю как это запилить правильно и правильный ли подход вообще. Кстати, а для чего хэш %seen в твоем скрипте?
PS На БАШе наваял скрипт на коленке за 10 минут, но препод просит на Perl. Понять не могу зачем он мне как веб разрабу, где он вообще используется? в Майл.ру только?
#!/bin/shmkdir /tmp/src_dir
mkdir /tmp/dst_dirtouch /tmp/src_dir/2014-06-21 /tmp/src_dir/2014-06-22 /tmp/src_dir/2014-06-23
cp /tmp/src_dir/2014-06-21 /tmp/src_dir/2014-06-22 /tmp/dst_dir/
/tmp/script.pl
Может по разному понимаем src и dst ((
От жары у меня мозг плавится ))
> #!/bin/sh
> mkdir /tmp/src_dir
> mkdir /tmp/dst_dir
> touch /tmp/src_dir/2014-06-21 /tmp/src_dir/2014-06-22 /tmp/src_dir/2014-06-23
> cp /tmp/src_dir/2014-06-21 /tmp/src_dir/2014-06-22 /tmp/dst_dir/
> /tmp/script.pl
> Может по разному понимаем src и dst ((
> От жары у меня мозг плавится ))Возможно, я не точно описал задание.
Дело в том,что в src_dir(директория откуда файлы будут копироваться) имя файлов не содержат никакой даты.
А уже после копирования этих файлов в dst_dir к имени каждого файла из src_dir добавляется дата копирования.Т.е скрипт должен проверить есть ли для каждого файла из src_dir копия за вчерашний день в dst_dir, ну и на вывести имя файла из src_dir,который не был скопирован\отсутствует в dst_dir.
Но опять же, opendir() юзать нельзя, значит скорее всего надо строки сравнивать.
> От жары у меня мозг плавится ))Косяк. Не внимателен был.
Так попробуйте.
#!/usr/bin/perluse strict;
use warnings;
use POSIX;
my $srcd = "/tmp/src_dir";
my $dstd = "/tmp/dst_dir";my $yesterday = strftime "%F", localtime(time-86400);
my @src;
open SRC, "-|", "ls $srcd";
while(<SRC>) {
chomp;
push @src, $_;
}
close SRC;
my @dst;
open DST, "-|", "ls $dstd";
while(<DST>) {
chomp;
push @dst, $_ if /$yesterday/;
}
close DST;my %seen;
foreach my $file (@dst) {$seen{$file} = 1}
foreach my $file (@src) {
unless ($seen{"$file-$yesterday"}) {
print "File $file-$yesterday not found!\n";
}
}Жара ))
#!/bin/shdata=$(date -v -1d "+%F")
mkdir /tmp/src_dir
mkdir /tmp/dst_dirtouch /tmp/src_dir/01 /tmp/src_dir/02 /tmp/src_dir/03 /tmp/src_dir/04 /tmp/src_dir/05
cp /tmp/src_dir/01 /tmp/dst_dir/01-$data
cp /tmp/src_dir/02 /tmp/dst_dir/02-$data
cp /tmp/src_dir/05 /tmp/dst_dir/05-$data/tmp/script.pl
Блин, ну сейчас-то всё как надо? )) А то я волнуюсь, переживаю ))))))))
>[оверквотинг удален]
> data=$(date -v -1d "+%F")
> mkdir /tmp/src_dir
> mkdir /tmp/dst_dir
> touch /tmp/src_dir/01 /tmp/src_dir/02 /tmp/src_dir/03 /tmp/src_dir/04 /tmp/src_dir/05
> cp /tmp/src_dir/01 /tmp/dst_dir/01-$data
> cp /tmp/src_dir/02 /tmp/dst_dir/02-$data
> cp /tmp/src_dir/05 /tmp/dst_dir/05-$data
> /tmp/script.pl
> Блин, ну сейчас-то всё как надо? )) А то я волнуюсь, переживаю
> ))))))))Да, все супер. Спасибо Вам!
А все-таки как думаете, если бы через сравнене строк сделать быстрее бы скрипт выполнялся?Чисто теоретически.