Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Некоторые заметки по языку программирования perl


Служба Рассылок Subscribe.Ru

Сканирование поддиректорий


Иногда бывает необходимо заменить во всех файлах всех поддиректорий какое-либо
слово или баннер. Можно воспользоваться программой, которая рекурсивно ходит
по поддиректориям и просматривает в них все файлы. В принципе на основе этого
скрипта возможно выводить дерево каталогов или наводить статистику по всем файлам,
допустим столько-то html, столько-то txt. Или просто иногда поискать что-нибудь,
используя аналог unix'овой команды find. Приведенный код позволяет просматривать
все файлы в поддиректории и заменять в них код определенного баннера:


#!/usr/bin/perl
$dir="/usr/local/www/allsitecopy";
&scan($dir);
sub  scan {
  my $dir=$_[0];
  my (@files,$filen,$ndir,$n,$mass,@dirs);
  opendir D, $dir or warn "Cannot open $dir: $!" and next;
  @dirs=grep {!(/^\./) && -d "$dir/$_"} readdir D;
  rewinddir D;
  @files=grep {!(/^\./) && /html/i && -f "$dir/$_"} readdir D;
  closedir D;

  for $n(0..$#dirs) {
    $ndir=$dir."/".$dirs[$n];
    &scan($ndir);
  }
  for $n(0..$#files) {
    $filen=$dir."/".$files[$n];
    print "$filen all ok!\n" if($filen=~m!\.html$!i);
    if($filen=~m!\.html$!i){ local $/="\001";
      open F, "<$filen"; $mass=<F>; close F;
      open F, ">$filen";
      $mass=~s%<!--begin banner1-->(.*?)<!--end banner1-->%%igsm;
      print F $mass;
      close F;
    }
  }
  return 1;
}

можно немного модифицировать приведенный выше код:

#!/usr/bin/perl
my $dir="/usr/local/www/allsitecopy";
all_files($dir);
sub all_files{
  my $cur_dir = shift;
  chdir $cur_dir || warn "can't open dir $cur_dir\n";
  foreach(<*>){
   if (-f "$cur_dir/$_") { action("$cur_dir/$_"); }
   if (-d "$cur_dir/$_") { all_files("$cur_dir/$_"); }
  }
}

sub action{
  ...что то там сделать...
  my $file = shift;
  print "$file\n";
}

Это-же можно сделать и из командной строки введя примерно такую команду:

find /usr/local/www/allsitecopy -name \*.html -print | xargs \
  perl -p0i.bak -e 's/<\!--begin banner1-->(.*?)<\!--end banner1-->//igs'

http://genphys.phys.msu.su/~dmitriy/perl/file.shtml#skan

Ждите следующую рассылку!

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное