Помогите решить задачку, johny69, 23-Июн-14, 14:54 [смотреть все]Всех приветствую! Условие: есть некоторое количество файлов в директории /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` Даже не знаю с какой стороны подойти к этой задаче. Буду благодарен любой помощи!
|
- Помогите решить задачку, pavlinux, 21:23 , 23-Июн-14 (1)
> Даже не знаю с какой стороны подойти Cпереди!
- Помогите решить задачку, Аноним, 01:37 , 24-Июн-14 (2)
>> Даже не знаю с какой стороны подойти > Cпереди!Ну кто же нынче воюет в двубортых! Подходи сзади конечно! И ВНЕЗАПНО!
- Помогите решить задачку, михалыч, 08:49 , 24-Июн-14 (4) +1
> Даже не знаю с какой стороны подойти к этой задаче. Буду благодарен > любой помощи!А да пожалуйста, а да на здоровье!
#!/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. Сборник рецептов. Для профессионалов авторы Кристиансен Т. Торкингтон Н." и будет понятно "с какой стороны подходить"
- Помогите решить задачку, johny69, 13:50 , 24-Июн-14 (6)
>[оверквотинг удален] > 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. Сборник рецептов. Для профессионалов авторы Кристиансен Т. Торкингтон > Н." > и будет понятно "с какой стороны подходить" От души, Михалыч!Но это, пожалуй, очень сложное решение для меня. И почему-то не работает скрипт. Имею в /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. Понять не могу зачем он мне как веб разрабу, где он вообще используется? в Майл.ру только?
- Помогите решить задачку, михалыч, 15:56 , 24-Июн-14 (7)
#!/bin/shmkdir /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 (( От жары у меня мозг плавится ))
- Помогите решить задачку, johny69, 16:35 , 24-Июн-14 (8)
> #!/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() юзать нельзя, значит скорее всего надо строки сравнивать.
- Помогите решить задачку, михалыч, 16:36 , 24-Июн-14 (9)
> От жары у меня мозг плавится )) Косяк. Не внимателен был. Так попробуйте. #!/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"; } }
Жара ))
- Помогите решить задачку, михалыч, 17:22 , 24-Июн-14 (10)
#!/bin/shdata=$(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 Блин, ну сейчас-то всё как надо? )) А то я волнуюсь, переживаю ))))))))
- Помогите решить задачку, johny69, 18:05 , 24-Июн-14 (11)
>[оверквотинг удален] > 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 > Блин, ну сейчас-то всё как надо? )) А то я волнуюсь, переживаю > )))))))) Да, все супер. Спасибо Вам! А все-таки как думаете, если бы через сравнене строк сделать быстрее бы скрипт выполнялся?Чисто теоретически.
|