|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 14 Mar 2007 18:03:48 To : Sergey Subject : Re: Про копирования каталогов... -------------------------------------------------------------------------------- Sergey -> Artem Chuprina @ Tue, 13 Mar 2007 12:13:09 +0000 (UTC): S> Правда ваша :) Вот сделал как.... Может посоветуете покрасивее, мож S> работать быстрее будет... да и вааще покажите как гуру этот вариант S> бы написали??? Вариант-то класический, а в книжках как-то коряво S> все... :) Пробую. sub copy_dir # имена функций большими буквами применяются для констант { my $exc_fn = -e "$ETC/$SERVER.excl" ? "$ETC/$SERVER.excl" : "$ETC/default.excl" open(my $excf, '<', $exc_fn) # поскольку файлхендл - my, он автомагически закроется при выходе из функции or die "Cannot open $exc_fn: $!" my %excl = map {chomp; $_=>1} <$excf>; # раз уж мы проверяем исключения на точное совпадение, то и надо # это делать через проверку вхождения в хэш opendir(my $dh, $fromdir) or dir "Cannot open directory $fromdir: $!" foreach (<$dh>) { next if /^\./ || $excl{$_} || ! -d "$fromdir/$_"; Log(2, $_) for `$CP -pR -- "$fromdir/$_" "$outdir/" 2>&1` } } Hу и до кучи - я бы имя сервера, и возможно, обеих директорий передавал бы в copy_dir параметрами. Меньше глобальных переменных - целее жопа... Можно еще сократить строчку "next if", засунув ее аргумент в grep строчкой выше, но лучше от этого не станет. Да. Ты бы все-таки, если уж утверждаешь, что у тебя скрипт заработал, копировал бы заработавший кусок. А то поди догадайся по твоим опечаткам, что именно ты там имел в виду... S> ----------------- S> #!/usr/bin/perl -w S> $ETC = "/usr/local/etc/dir" S> $SERVER=split(/,/, $ARGV[0]); S> $SERVER =~ tr/a-z/A-Z/; S> $fromdir="/tmp/fromdir"; S> $outdir="/tmp/outdir"; S> $CP="bin/cp"; S> sub COPY_DIR S> { S> my (@strs,$str,@dirs,$dir,@dirsnew); S> if ( -e $ETC/$SERVER\.excl) S> { S> open (EXC, "$ETC/$SERVER\.excl); S> } S> else S> { S> open (EXC, "$ETC/default\.excl"); S> } S> @exc = <EXC>; S> chomp (@exc); S> close EXC; S> opendir (D, $fromdir) or warn "Cannot open S> $fromdir: !" and next; S> @dirs=grep {!(/^\./) && "$fromdir/$_"} readdir D; S> rewinddir D; S> closedir D; S> @dirhash{@exc}=(); S> foreach $dir (@dirs) { S> push (@dirsnew, $dir) unless exists $dirhash{$dir}; S> } S> foreach $dir (@dirsnew) { S> @strs=`($CP -pR -- "$fromdir/$dir" "$outdir") &2>1`; S> foreach $str (@strs) S> { S> &Log(2,"$str"); S> } S> } S> } >> Да, в команде копирования в "$outdir" перед закрывающей кавычкой добавь >> / - может пригодиться... S> Да пригодилось... сенкс... S> -------- >> Artem Chuprina >> RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru S> ----------------- S> С уважением Сергей S> -- S> Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru -- Artem Chuprina RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru ожидания по умолчанию приводят к обломам по определению. http://apraxina.livejournal.com/301026.html --- ifmail v.2.15dev5.3 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/25606eaf51234.html, оценка из 5, голосов 10
|