我的代码涉及转到主机(使用openSSH(,获取与模式匹配的文件列表(使用远程查找命令-OpenSSH执行(,然后打开我得到的每个文件并处理每个文件(grepping等(。我已经完成了获取文件名并传递给函数的工作。现在,我必须将这些文件名传递给一个函数,在该函数中我打开每个文件名并对其进行处理。我正在尝试使用文件::远程执行此操作,如下所示:
sub processFiles{
my $fileList =shift;
#Iterate over the file and try to find start and stop time stamps from the file
for my $file ( @{$fileList}) {
#finding start time of file:its found in lines of file
my $HEAD;
open $HEAD, "host:head -1000 $File|" or die "Unable to check file for starting time";
while ( <$HEAD> ) {
#process...
但是我无法在主机上打开文件,因为我收到错误。
批量执行远程操作时,第一个原则是减少 ssh 连接的数量(理想情况下只有一个(。使用 shell 或 perl 一个衬里,你可以做非常复杂的动作。以下是我对你需求的理解:
ssh hostname 'find dirname -name *.pl| xargs grep -l pattern /dev/null'
您可以在同一条生产线上通过管道进行进一步处理。如果要在本地处理文件,可以在单个命令中传输所有文件。下面是一个完整的示例:
use Archive::Tar;
open my $file, '-|', 'ssh -C hostname "find dirname -name *.pl | xargs grep -l pattern /dev/null | xargs tar c"'
or die "Can't pipe: $!";
my $tar = Archive::Tar->new($file);
foreach my $file ($tar->get_files()) {
print $file->name, ', ', $file->size, "n";
}
File::Remote 模块不是标准 Perl 安装的一部分。如果要使用此模块,则需要安装它。
你如何安装它取决于你使用的平台以及你如何安装 Perl。在使用Perl系统的Linux安装中,您可以尝试sudo yum install perl-File-Remote
(在基于RedHat的系统上(或sudo apt-get install libfile-remote-perl
(在基于Debian/Ubuntu的系统上(。您也可以尝试使用cpan或cpam来安装它。
我还建议,由于这个模块最后一次更新是在 2005 年,所以很可能是未维护的,所以我会对使用它持谨慎态度。