|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/64886e9705f8.html, оценка из 5, голосов 10
|