The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Помогите решить задачку"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"Помогите решить задачку"  +/
Сообщение от johny69 on 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`


Даже не знаю с какой стороны подойти к этой задаче. Буду благодарен любой помощи!

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Помогите решить задачку"  +/
Сообщение от pavlinux (ok) on 23-Июн-14, 21:23 
> Даже не знаю с какой стороны подойти

Cпереди!  

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Помогите решить задачку"  +/
Сообщение от Аноним (??) on 24-Июн-14, 01:37 
>> Даже не знаю с какой стороны подойти
> Cпереди!

Ну кто же нынче воюет в двубортых! Подходи сзади конечно! И ВНЕЗАПНО!

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Помогите решить задачку"  +/
Сообщение от Pahanivo (ok) on 24-Июн-14, 07:57 
а чо сессия еще не кончилась?


Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "Помогите решить задачку"  +/
Сообщение от Andrey Mitrofanov on 24-Июн-14, 09:21 
> а чо сессия еще не кончилась?

Ну, мало ли. Пересдача, собеседование, ...

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

4. "Помогите решить задачку"  +1 +/
Сообщение от михалыч (ok) on 24-Июн-14, 08:49 
> Даже не знаю с какой стороны подойти к этой задаче. Буду благодарен
> любой помощи!

А да пожалуйста, а да на здоровье!

#!/usr/bin/perl

use 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. Сборник рецептов. Для профессионалов авторы Кристиансен Т. Торкингтон Н."
и будет понятно "с какой стороны подходить"

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

6. "Помогите решить задачку"  +/
Сообщение от johny69 on 24-Июн-14, 13:50 
>[оверквотинг удален]
> 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. Понять не могу зачем он мне как веб разрабу, где он вообще используется? в Майл.ру только?

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "Помогите решить задачку"  +/
Сообщение от михалыч (ok) on 24-Июн-14, 15:56 
#!/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 ((

От жары у меня мозг плавится ))

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Помогите решить задачку"  +/
Сообщение от johny69 on 24-Июн-14, 16:35 
> #!/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() юзать нельзя, значит скорее всего надо строки сравнивать.

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "Помогите решить задачку"  +/
Сообщение от михалыч (ok) on 24-Июн-14, 16:36 
> От жары у меня мозг плавится ))

Косяк. Не внимателен был.

Так попробуйте.


#!/usr/bin/perl

use 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";
    }
}

Жара ))

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

10. "Помогите решить задачку"  +/
Сообщение от михалыч (ok) on 24-Июн-14, 17:22 
#!/bin/sh

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

Блин, ну сейчас-то всё как надо? )) А то я волнуюсь, переживаю ))))))))

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "Помогите решить задачку"  +/
Сообщение от johny69 on 24-Июн-14, 18:05 
>[оверквотинг удален]
> 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
> Блин, ну сейчас-то всё как надо? )) А то я волнуюсь, переживаю
> ))))))))

Да, все супер. Спасибо Вам!
А все-таки как думаете, если бы через сравнене строк сделать быстрее бы скрипт выполнялся?Чисто теоретически.

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру