在linux上:cp:源文件后缺少目标文件操作数

时间:2013-01-03 11:11:14

标签: perl

下面的代码是脚本的一部分,我在其中合并不同目录的文件。合并后我将剩余的文件复制到最终目录中。 合并工作正常但在复制文件时我得到了

cp: missing destination file operand after `/users/abc/perl_scripts/temp_dir/b.cc'
Try `cp --help' for more information.
sh: line 1: /users/abc/perl_scripts/temp: is a directory

for $k(dir1) {
     $flag=0;
     for $j(@dir2) {
          if("$k" eq "$j") {
               &merge_gcov("$UERRC1/$k","$UERRC2/$k","$DATA_DIR/$k");
               $flag=1;
               last;                            
          }
     }
     if($flag == 0) {
           #print ">>>>>>>>>>>>> cp $UERRC1/$k $DATA_DIR/$k \n";
           'cp $UERRC1/$k,$DATA_DIR`;
     }
 }

任何人都可以帮我解决这个问题......

2 个答案:

答案 0 :(得分:5)

无论何时使用系统调用,您最有可能做一些多余的事情,在这种情况下肯定是多余的。 Perl非常能够复制文件。我推荐File::Copy模块,它是perl 5中的核心模块。使用它很简单:

use File::Copy qw(copy);
copy $from, $to or die $!;   # it is a good idea to check if the copy failed

此外,不是循环遍历@dir2中的所有文件名,而是查看名称是否与$k中的名称匹配,为什么不检查该文件是否存在于另一个目录中? E.g。

if (-e "$UERRC1/$k") {    # check if file exists
    merge_gcov("$UERRC1/$k", "$UERRC2/$k", "$DATA_DIR/$k"); 
} else { 
    copy "$UERRC1/$k", $DATA_DIR or die $!; 
}

文件测试-e的文档位于perldoc -f "-X"

你真的应该使用更合适的变量名。它将使您的代码更易读,更易于维护和调试。

也...

在您执行任何其他操作之前,您应该在脚本中添加以下两行并修复无疑出现的错误:

use strict;
use warnings;

strict将强制您声明所有变量(通常使用my $foo),这将删除由于变量名称中的拼写错误而难以检测的错误。错误消息将显示为“全局符号$ foo需要显式包名称...”。

warnings会为您提供有关您做错事情的信息。这是一件好事。

答案 1 :(得分:1)

cp的参数格式为cp from to,但您有cp from,to

这可能是它抱怨参数数量的原因 - $UERRC1/$k,$DATA_DIR单个参数。它应该是cp $UERRC1/$k $DATA_DIR,就像你的打印声明一样。

相关问题