如何在perl中执行包含perl变量的unix命令

时间:2019-07-14 15:25:52

标签: perl

在下面的perl代码中,我打算使用以下命令将一个perl变量$ file从一个目录复制到另一个目录:

"system("cp $file  $Output_Dir);

此命令可以记下文件名,然后显示:

cp: cannot stat 'tasmax_AFR-44_CNRM-CERFACS-CNRM-CM5_historical_r1i1p1_CLMcom-CCLM4-8-17_v1_day_19910101-19951231.nc': No such file or directory

命令

      system("@sixfiles = ls $Vars[$kk]}*");

给我错误:     sh:1:=:找不到 我想知道这段代码有什么问题。协助将不胜感激。

#!/usr/bin/perl -w
use strict;
use warnings;
use File::Path;
use File::Copy;

my $debug = 1;

my @Vars = ("pr","tasmin","tasmax");
my $Vars;
my @sixfiles;
my $sixfiles;

my $Input_Dir = "/home/zmumba/DATA/Input_Dir";
my $Output_Dir = "/home/zmumba/DATA/Output_Dir";

for (my $kk=0; $kk < @Vars; ++$kk) {
    opendir my $in_dir, $Input_Dir or die "opendir failed on $Input_Dir: $! ($^E)";
    while (my $file=readdir $in_dir) {               
        next unless $file =~ /^$Vars[$kk]/;
        next if -d $file;
        print "$file\n";
        print "Copying $file\n" if $debug;
        my $cmd01 = "cp $file  $Output_Dir";
        print "Doing system ($cmd01)\n" if $debug;
        system ($cmd01);
        system("@sixfiles = ls $Vars[$kk]}*");
    }
}

3 个答案:

答案 0 :(得分:0)

尝试一下:

use feature qw(say);
use strict;
use warnings;
use File::Spec;

my @Vars = ("pr","tasmin","tasmax");
my $Input_Dir = "/home/zmumba/DATA/Input_Dir";
my $Output_Dir = "/home/zmumba/DATA/Output_Dir";

opendir my $in_dir, $Input_Dir or die "opendir failed on $Input_Dir: $! ($^E)";
while (my $file=readdir $in_dir) {
    next if ($file eq '.') || ($file eq '..');
    next if -d $file;
    next if !grep { $file =~ /^$_/ } @Vars;
    say "Copying $file";
    $file = File::Spec->catfile( $Input_Dir, $file );
    system "cp", $file, $Output_Dir;
}

答案 1 :(得分:0)

system ($cmd01);
     

礼物:

cp: cannot stat '<long-but-correct-file-name>': No such file or directory

这几乎可以肯定是因为您没有运行$Input_Dir中的代码,所以该文件在当前目录中不存在。您需要chdir到正确的目录,或将目录路径添加到文件名变量的前面。

system("@sixfiles = ls $Vars[$kk]}*");

此代码没有任何意义。传递给system()的代码必须是Unix shell代码。这就是ls $Vars[$kk]}*位(但是我不确定}的来源)。您不能在shell命令中填充Perl数组。您需要捕获ls命令返回的值,然后以某种方式解析它以将其分成一个列表。

答案 2 :(得分:0)

您可以尝试以下代码:

#!/usr/bin/env perl
use strict;
use warnings;

my $debug = 1;

my @Vars = ("pr", "tasmin", "tasmax");
my $Vars;
my $Input_Dir = "/home/zmumba/DATA/Input_Dir";
my $Output_Dir = "/home/zmumba/DATA/Output_Dir";
my $cpsrc, $cpdest = '';

print "No Write Permission: $!" unless(-w $Output_Dir);

for my $findex (0 .. $#Vars) {
    $cpsrc = qq($Input_Dir/$Vars[$findex]);

    print "$Vars[$findex]\n";
    print "Copying $Vars[$findex]\n" if $debug;
    my $cmd01 = "cp $cpsrc $Output_Dir";
    print "Doing system ($cmd01)\n" if $debug;
    system($cmd01);
}

您不必遍历源目录中的每个文件。您已经知道要从源复制的文件。