我将文件从远程机器复制到本地,此操作每天执行一次。如果在远程文件内容中追加内容,我只会将附加的内容复制到本地文件(因为它已经存在于本地机器上)。我正在使用CPAN的Net :: SFTP :: Foreign模块,但似乎是在附加的情况下复制完整的文件(这是不期望的)。
use strict;
use warnings;
use Net::SFTP::Foreign;
my $file = '/home/user/temp/test.txt';
my $destination = '/home/user/dest.txt';
my $sftp = Net::SFTP::Foreign->new(
host => 'localhost', # using localhost for destination and source
more => [ -o => 'Compression yes', '-v' ]
);
$sftp->get( $file, $destination, copy_perm => 1, append => 1 );
if($sftp->error) {
print "get operation failed for $file : " . $sftp->error . "\n";
}
我检查了Net / SFTP / Foreign.pm模块的get()实现,并在附加的情况下找到了下面的代码片段 -
my $flags = Fcntl::O_CREAT|Fcntl::O_WRONLY;
$flags |= Fcntl::O_APPEND if $append;
$lstart = sysseek($fh, 0, 1) if $append;
如果是append,$ lstart只包含0,它是文件的开头。我在这里错过了什么吗?
答案 0 :(得分:1)
感谢您的评论,实际上我找到了它无法正常工作的原因。它一直用远程文件覆盖本地文件。 但是当我使用下面的代码时:
$sftp->get(
$file,
'/home/user/test.log',
append => 1,
overwrite => 0,
);
现在它不会覆盖文件,而是将整个文件附加到本地文件。 虽然我想只是添加添加到远程文件而不是整个文件的文本。 Net :: SFTP :: Foreign不支持此功能。