Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : vilfred                              2:5020/400     16 Dec 2001  21:11:12
 To : Artem Chuprina
 Subject : вот 4 способа рекурсивно гулять по поддиректориям
 -------------------------------------------------------------------------------- 
 
 Привет!!
 
 VB>> Есть така проблема - надо рекурсивно
 AC> прочитать каталог с подкаталогами
 VB>> и переименовать все файлы в такие же, но в
 AC> нижнем регистре (под линуксом).
 VB>> Заранее спасибо!
 
 AC> use File::Find?
 
 можно и через файлфинд, только оно и директории и файлы переименовывает 
 из одной кодировки в другую. Hадо было как-то перелопатить 20 гигабайт. 
 
 по ссылке полное решение, только не вздумай запустить, прежде чем 
 разберешься че она делает... а то похренишь все нахрен, не там 
 какуюннить команду вставив ченнить типа system("rename $_, $i")
 
 http://genphys.phys.msu.su/~dmitriy/perl/modules.shtml#rename
 
 короче там только сканирование поддиректорий. Эта же прога где-то в 
 мане была... И еще где-то встречал её...
 
 с файл финд вообще можно в три строчки, а можно и в побольше:
 
 #!/usr/bin/perl -w
 use strict;
 use File::Find;
 find( \&wanted, '/usr/local/www/allsitecopy' );
 sub wanted {
   return if /^\.\.?$/ and not /\.html?$/i and not -f;
   local $/;
   open F, "< $File::Find::name" or do {
     warn "Cannot read from $File::Find::name: $!";
     return;
   };
   binmode F;
   my $mass = <F>;
   close F;
   $mass=~s%$stroka_na_kotoruju_zamenyaesh%$stroka_k_zamene%igm;
   open F, "> $File::Find::name" or do {
     warn "Cannot write to $File::Find::name: $!";
     return;
   };
   binmode F;
   print F $mass;
   close F;
   print "$File::Find::name all ok!\n";
 }
 
 или другая программа:
 
 #!/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'
 
 или, если файлы лежат в текущей директории, то из командной строки 
 сказать нечто вроде:
 
 perl -i -n -p -e 's!ТРАМ-ПАМ-ПАМ!ПАМ-ТРАМ-ТРАМ!' *
 
 или
 
 чего-то типа этого вобщем... если еще чуть-чуть попыхтеть, то можно 
 написать аналог slocate :)
 
 А вообще все это отсюда, кроме файлфинда, надо бы дописать:
 
 http://genphys.phys.msu.su/~dmitriy/perl/file.shtml#skan 
 Дима
 -- 
 TEAM [Маньяки]
 Отправлено через сервер Talk.Ru - http://www.talk.ru
 --- ifmail v.2.15dev5
  * Origin: Talk.ru (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Rename files to lowercase   Vasily Banyay   13 Dec 2001 15:17:05 
 Re: Rename files to lowercase   Artem Chuprina   13 Dec 2001 15:21:09 
 вот 4 способа рекурсивно гулять по поддиректориям   vilfred   16 Dec 2001 21:11:12 
Архивное /ru.perl/64886e9705f8.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional