簡體   English   中英

Perl Net::SFTP::Foreign 從遠程服務器獲取最新文件

[英]Perl Net::SFTP::Foreign to get latest file from remote server

我正在嘗試使用 Perl Net::SFTP::Foreign模塊將文件從遠程服務器傳輸到本地服務器。

這是我的代碼:

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;
use Net::SFTP::Foreign;

my $host = "host.ip.address.here";
my $user = "username";
my $pass = "password";

my $path      = "/path/to/the/remote/server/directory";
my $local_dir = "/local/dir/path/";

my $sftp = Net::SFTP::Foreign->new(host=>$host , user=>$user , password=>$pass);
$sftp->die_on_error("Unable to establish SFTP connection");
$sftp->setcwd($path) or die "unable to change cwd: " . $sftp->error;

my @file = $sftp->ls($path);
print Dumper(\@file);

$sftp->mget("$path/test*.csv", $local_dir); 

我的遠程服務器中有文件列表-

test123.csv
test234.csv
test341.csv
test890.csv
test765.csv
test110.csv

這里的事情是我想從$path目錄中獲取最新文件,該文件基於修改日期。 (我無法找到解決方案)

有什么命令可以做到這一點嗎?

我發現的其他方法是循環@files數組,但我如何獲取最新文件? 此外,我不想循環,因為$path有很多文件需要很長時間才能執行。

所以我想使用一個命令來獲取遠程文件。 任何想法?

看看文檔的 $sftp->stat($ path_or_fh ) 方法

它返回有關文件的屬性列表,包括 mtime。 您必須為您提取的每個文件獲取 mtime 並通過最新文件上的代碼做出決定。

我找到了以下解決方案。 在這里發布我的答案,這樣它可以幫助尋找類似要求的人。

以下是上述(有問題的)腳本的延續代碼。

my %filehash;

foreach (@$files){
    my $file = $_->{filename};
    next unless($file =~ m/test(.*)\.csv/);

    my $stat_attr = $sftp->stat($file) or die "remote stat command failed: ".$sftp->status;

    my $size  = $stat_attr->size;
    my $mtime = $stat_attr->mtime;

    $filehash{$file}{'MTIME'} = $mtime;
}

my $recent_file = List::Util::reduce { $filehash{$b} > $filehash{$a} ? $b : $a } keys %filehash;
print "Recent FILE:$recent_file, TIME:$filehash{$recent_file}{'MTIME'}\n";

$sftp->mget("$path$recent_file", $local_dir); 
$sftp->disconnect;

系統應支持List::Util; perl 模塊,應該在腳本的開頭使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM