The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Помогите решить задачку, !*! 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переди!  

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

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

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

    • Помогите решить задачку, !*! 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/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 ((

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

        • Помогите решить задачку, !*! 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/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";
              }
          }

          Жара ))

          • Помогите решить задачку, !*! михалыч, 17:22 , 24-Июн-14 (10)
            #!/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

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

            • Помогите решить задачку, !*! 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
              > Блин, ну сейчас-то всё как надо? )) А то я волнуюсь, переживаю
              > ))))))))

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




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

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