从Perl执行命令行命令?

时间:2010-11-05 00:07:37

标签: perl bash command-line command system

全部,

我需要从Perl文件执行此命令行命令:

for file in *.jpg ; do mv $file `echo $file | sed 's/\(.*\.\)jpg/\1jp4/'` ; done

所以我添加了文件夹并尝试了:

system "bash -c 'for file in $mov0to/*.jp4 ; do mv $file `echo $basedir/internal/0/$file | sed 's/\(.*\.\)jp4/\1jpg/'` ; done'";

但我得到的只是:

sh: Syntax error: "(" unexpected
No file specified

我在Kubuntu 10.4

谢谢, 扬

3 个答案:

答案 0 :(得分:4)

我可以想到许多更好的方法,但理想情况下你想要纯粹的Perl:

use File::Copy qw( move );
opendir DIR, $mov0to or die "Unable to open $mov0to: $!";
foreach my $file ( readdir DIR ) {
    my $out = $file;
    next unless $out =~ s/\.jp4$/.jpg/;
    move "$mov0to/$file", "$basedir/internal/0/$out" or die "Unable to move $mov0to/$file->$basedir/internal/0/$out: $!";
}
closedir DIR;

如果你坚持用Bash进行解除,你应该这样做:

system qq(bash -c 'for file in $mov0to/*.jp4 ; do mv \$file $basedir/internal/0/\${file\/%.jp4\/.jpg} ; done');

答案 1 :(得分:1)

双引号内的所有变量都将被插值,特别是你在bash for循环中使用的$file。我们没有足够的上下文来了解其他变量($mov0to$basedir)的来源或它们包含的内容,因此它们可能存在相同的问题。双引号也在sed部分吃掉你的反斜杠。

安迪怀特是对的,如果bash命令在一个单独的脚本中,你就不会那么乱。

答案 2 :(得分:0)

这很可能是嵌套引号的问题。我建议将bash命令移动到自己的(bash)脚本文件中,或者直接在Perl代码中编写循环/逻辑,如果需要,可以进行更简单的系统调用。