Использование Perl :: SFTP :: Foreign count файлов через ls () - PullRequest
0 голосов
/ 14 мая 2018

Использование Perl :: SFTP :: Foreign Я пытаюсь подсчитать количество файлов с определенным дескриптором файла.

В результате мы будем постепенно увеличивать число файлов во время команды переименования в коде.такой, что первый zip-файл переименовывается в filename.zip.bak, затем filename.zip.bak2, затем filename.zip.bak3

my $file = "filename.zip"
$reName  = ".bak";

@rls = $sftp->ls('.', wanted => qr/$file.*/ );    
$rls_size = @rls;
$fileReName = $file . $reName;


if ( $rls_size > 1 ) {
    $fileReName = $fileReName . $rls_size ;
}

unless ( $sftp->rename($file, $fileReName) ) {
    Print "Error Renaming $file to $fileReName. $@ $!\n");
}

Извините за форматирование.Код продолжает возвращать одну запись в массиве, чтобы не назначать число, превышающее 1, даже если есть 2 или более, которые обычно выбираются при подсчете.Что-то не так с требуемым оператором и форматированием заданного ожидания регулярного выражения?

Вот старый код Net :: FTP, который использовался для выполнения той же функции:

sub process_file($)
{   my $file = $_[0];

    if($reName)
    {   
        @rls = $ftp->ls($file."*");
        $rls_size = @rls;
        $fileReName = $file . $reName;
        if($rls_size > 1){  $fileReName = $fileReName . $rls_size;  }

        unless ($ftp->rename($file,$fileReName))
        {   PrintLog (0, "Error Renaming $file to $fileReName. $@ $!\n");   
            $error =101;
            exit 101;
        }else{  PrintLog (7, "Renamed File $file to $fileReName.\n");   }
    }
    else{
        unless ($ftp->delete($file))
        {   PrintLog (0, "Error deleting $file. $@ $!\n");  
            $error =101;    
            exit 101;
        }else{  PrintLog (7, "Deleted $file.\n");   }
    }

}

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Изменив команду с ls () на использование find (), она исправила проблему. В частности, следующий код был заменен

С

@rls = $sftp->ls('.', wanted => qr/$file.*/ );

К

@rls = $sftp->find('.',wanted=> qr/^$file.*/ );

Это успешно сгенерировало массив ожидаемого размера. Похоже, это разница между ls (один массив хэшей) и find (список хэшей).

0 голосов
/ 14 мая 2018

Если вы действительно используете Net::SFTP::Foreign, тогда эта строка неверна.

@rls = $sftp->ls('.',wanted=> qr/$file.*/ );    

В документации сказано, что метод ls возвращает ссылку на массив хешей

...