http://metacpan.org/pod/Net::SFTP::Foreign
my ( $user, $password, $host ) = @_;
my ( $source, $dest ) = '/whatever';
my $sftp = Net::SFTP::Foreign->new(
user => $user,
host => $host,
password => $password,
more => [ -o => 'StrictHostKeyChecking no' ]
);
$sftp->rput(
$source, $dest,
overwrite => 1,
on_error =>
sub { print $sftp->error; }
);
$dest が $host に存在する場合、rput の on_error が常に発生し、$sftp->error は "リモート ディレクトリ '/whatever' already exists" になります。
エラーにもかかわらず、rput は続行し、dir を再帰的にコピーしますが、ターゲット ホストでは、/whatever ではなく、/whatever の下にコピーされます。つまり、/whatever/whatever になります。
これは、rput の前に行うと厄介な回避策として機能しますが、実際には宛先ディレクトリを削除したくありません。
$sftp->rremove( $dest );
誰が私が間違っているのか分かりますか? 転送したいすべてのファイルをグロブしてから foreach $file (@glob_result) { $sftp->put ( yada, yada ) }; を実行したほうがよいでしょうか? それは非効率的でエラーが発生しやすいようです。