Страница 1 из 1

PERL on NW. File::Find - Кто использовал?

СообщениеДобавлено: 19 сен 2002, 13:35
skoltogyan
Cобственно, возможно, проблема с конструкицей
.....
if (-d)
......
Сам скрипт должен копировать директорию с поддиректориями в другую директорию

Source directory DOCUM:\TEST:
DOCUM:TEST\root.txt
test\DIR1\file1.txt
test\DIR2\file2.txt

На консоли сервера подаю:

perl c.pl docum:test docum:test1

Результат таков:
Source Dir=docum:test
Source File=docum:test
S=
mkdir: docum:test1
Call Number=2
Source Dir=docum:test
Source File=docum:test/root.txt
Call Number=3
Source Dir=docum:test
Source File=docum:test/DIR2
S=
Call Number=4
Source Dir=docum:test/DIR2
Source File=docum:test/DIR2/file2.txt
Call Number=5
Source Dir=docum:test
Source File=docum:test/DIR1
S=
Call Number=6
Source Dir=docum:test/DIR1
Source File=docum:test/DIR1/file1.txt


Press any key to exit
************************************************************** Почему-то поддиректории воспринимает как файл...:(
*
*******************

Собственно скрипт:
#!sys:/perl/lib
use file::Find;
if (scalar(@ARGV) < 2) {
print " use: copy_tree.pl [options] source dest [options]:"."\n";
print " +o - override files"."\n";
print " -o - copy new files (default)"."\n";
}
$OOO=1;
if (scalar(@ARGV) > 2) {
$source = $ARGV[1];
$dest = $ARGV[2];
$options = $ARGV[0];
} else {
$source = $ARGV[0];
$dest = $ARGV[1];
$options = '-o';
}
File::Find::find({wanted => \&process_file, no_chdir => 0}, $source);

local %dirs;
local $cur_dir;
$cur_dir = $dest;

sub process_file {
print "Call Number=".$OOO."\n";
$OOO=$OOO+1;
$dir = $File::Find::dir;
$file = $File::Find::name;
print"Source Dir=".$dir."\n";
print"Source File=".$file."\n";
if (-d) {
$s = substr($dir, length($source), length($dir)-length($source));
print"S=".$s."\n";
if (!$dirs{$s}) {
$dirs{$s} = 1;
$cur_dir = $dest.$s;
mkdir($cur_dir);
print "mkdir: $cur_dir\n";
}
return;
}


if (!file_exists($cur_dir.'/'.$_) || ($options eq '+o')) {
open(IN, "<$_");
open(OUT, ">$cur_dir/".$_);

$size = (stat)[7];
while ($len = sysread IN, $buf, $size) {
if (!defined($len)) {
next if $! =~ /^Interrupted/;
die "System read error: $!\n";
}
$offset = 0;
while ($len) {
defined($written = syswrite OUT, $buf, $len, $offset) or die "System write Error";
$len -= $written;
$offset += $written;
}
}
unlink($file);
close(IN);
close(OUT);
# print "move: $_ to $cur_dir\n";
}
}

sub file_exists {
return stat(shift);
}