URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9679
[ Назад ]

Исходное сообщение
"Работа с файлами и строками "

Отправлено wmr84 , 14-Май-13 22:37 
Всем привет!

Хочу сказать сразу, сегодня Perl увидел в первый раз.

Задача следующая:

Есть файл SN.txt, в котором построчно записаны серийники оборудования(один серийник - одна строка). Есть папка содержащая диагностические выдачи оборудования Cisco(sh tech).

Надо из всех файлов диагностических выдач отобрать только те, в которых содержится серийные номера из файла SN.txt.

После курения мануалов по perl получился вот такой монстр:


#!/usr/bin/perl

use File::Copy;

$dir = "test"; # вставить имя папки с диагностическими выдачами (регистр учитывается).
$dir_prepared = "right_dev";
$snfile = "SN.txt"; # вставить путь до файла с серийниками
$sn = "";
$shtechfilename = "";

if (! -d $dir_prepared) {
  mkdir($dir_prepared)
}

open (FILESN,$snfile) or die $!; # открываем файл с серийнками на чтение
while(defined ($sn = <FILESN>)) { # присваиваем переменой $sn значение
opendir(DIR,$dir); # открываем папку с диагностическими выдачами
while ($shtechfilename = readdir DIR) { присваиваем переменной $shtechfilename имя файла
  open (FILESH, $shtechfilename); # открываем файл с именем $shtechfilename
  while (<FILESH>){
   if (/$sn/){ # проверка на наличие в файле $shtechfilename серийника $sn
   move(\*FILESH, "$dir_prepared") || die "Move failed: $!"; №перемещение нужного файла в папку
   last;
   };
  };
  close FILESH;
};
closedir DIR;

};
Close FILESN;

и этот монстр отказывается работать.
Если добавить оператор print "$sn" в цикл while ($shfilename = <FILESH>) перед конструкцией if, то ничего не выводиться.

Народ я запутался. Подскажите что не так в этом скрипте?


Содержание

Сообщения в этом обсуждении
"Работа с файлами и строками "
Отправлено Andrey Mitrofanov , 15-Май-13 09:13 
> Хочу сказать сразу, сегодня Perl увидел в первый раз.

Галектика в апапсносте. :/

> Задача следующая:
> Есть файл SN.txt, в котором построчно записаны серийники оборудования(один серийник - одна
> строка). Есть папка содержащая диагностические выдачи оборудования Cisco(sh tech).
> Надо из всех файлов диагностических выдач отобрать только те, в которых содержится
> серийные номера из файла SN.txt.

fgrep -lF SN.txt /па/тапо/чка/*

> После курения мануалов по perl получился вот такой монстр:

Курение убивает!!


"Работа с файлами и строками "
Отправлено Andrey Mitrofanov , 15-Май-13 09:14 
> fgrep -lF SN.txt /па/тапо/чка/*

-lf , сорри.

> Курение убивает!!


"Работа с файлами и строками "
Отправлено михалыч , 17-Май-13 17:32 
>[оверквотинг удален]
>   };
>   close FILESH;
>  };
>  closedir DIR;
> };
> Close FILESN;
> и этот монстр отказывается работать.
> Если добавить оператор print "$sn" в цикл while ($shfilename = <FILESH>) перед
> конструкцией if, то ничего не выводиться.
> Народ я запутался. Подскажите что не так в этом скрипте?

Ну, что касаемо "перлов" Andrey Mitrofanov, то тут ни убавить, ни прибавить.
Вернее сказать, прибавить то оно конечно можно, но вот убавить точно не получится.
Блин, восхищаюсь я его меткостью, в яблочко кладет!

А если всё же на perl надо, то -

#!/usr/bin/perl

use strict;
use warnings;
use File::Copy;

my $dir = "test";
my $dir_prepared = "right_dev";
my $snfile = "SN.txt";
my $sn;
my $shtechfilename;

if ( ! -d $dir_prepared )
{
    mkdir ( $dir_prepared );
}

open ( FILESN, $snfile ) or die $!;
while ( $sn = <FILESN> )
{
    chomp $sn;
    opendir ( DIR, $dir );
    while ( $shtechfilename = readdir DIR )
    {
        next if $shtechfilename =~ /^\.\.?$/;
        open ( FILESH, "$dir/$shtechfilename" );
        while ( <FILESH> )
        {
            move ( "$dir/$shtechfilename", "$dir_prepared/$shtechfilename" ) if $_ =~ /$sn/;
        }
        close FILESH;
    }
    closedir DIR;
}
close FILESN;

Вроде работает. ))


"Работа с файлами и строками "
Отправлено wmr84 , 22-Май-13 10:42 
Михалыч, спасибо.