Всем привет!Хочу сказать сразу, сегодня Perl увидел в первый раз.
Задача следующая:
Есть файл SN.txt, в котором построчно записаны серийники оборудования(один серийник - одна строка). Есть папка содержащая диагностические выдачи оборудования Cisco(sh tech).
Надо из всех файлов диагностических выдач отобрать только те, в которых содержится серийные номера из файла SN.txt.
После курения мануалов по perl получился вот такой монстр:
#!/usr/bin/perluse 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, то ничего не выводиться.Народ я запутался. Подскажите что не так в этом скрипте?
> Хочу сказать сразу, сегодня Perl увидел в первый раз.Галектика в апапсносте. :/
> Задача следующая:
> Есть файл SN.txt, в котором построчно записаны серийники оборудования(один серийник - одна
> строка). Есть папка содержащая диагностические выдачи оборудования Cisco(sh tech).
> Надо из всех файлов диагностических выдач отобрать только те, в которых содержится
> серийные номера из файла SN.txt.fgrep -lF SN.txt /па/тапо/чка/*
> После курения мануалов по perl получился вот такой монстр:
Курение убивает!!
> fgrep -lF SN.txt /па/тапо/чка/*-lf , сорри.
> Курение убивает!!
>[оверквотинг удален]
> };
> 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;Вроде работает. ))
Михалыч, спасибо.