The OpenNET Project / Index page

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

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

"Работа с файлами и строками "  +/
Сообщение от wmr84 (ok) on 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, то ничего не выводиться.

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

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

Оглавление

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


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

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

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

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

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

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

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

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

-lf , сорри.

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

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

3. "Работа с файлами и строками "  +/
Сообщение от михалыч (ok) on 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;

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

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

4. "Работа с файлами и строками "  +/
Сообщение от wmr84 (ok) on 22-Май-13, 10:42 
Михалыч, спасибо.
Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

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

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




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

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