Perl Net :: SFTP :: Foreign, чтобы получить последний файл с удаленного сервера - PullRequest
2 голосов
/ 29 октября 2019

Я пытаюсь передать файл с удаленного сервера на локальный сервер с помощью модуля 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 имеет много файлов, выполнение которых займет много времени.

Поэтому я хотел получить удаленный файл с помощью одной команды. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Посмотрите на метод $ sftp-> stat ($ path_or_fh) docs

Возвращает список атрибутов файла, включая mtime. Вам нужно будет получить mtime для каждого файла, который вы извлекаете, и принять решение с помощью кода на последнем файле.

1 голос
/ 31 октября 2019

Я нашел следующее решение. Публикация моего ответа здесь, чтобы он мог помочь людям, ищущим подобные требования.

Ниже приведен код, являющийся продолжением вышеуказанного (опрошенного) скрипта.

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, который следует использовать в начале скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...