2010-11-05 309 views
1

大家好,从Perl执行命令行命令?

我需要从一个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

谢谢, Jan

+4

你正在炮击运行一个for循环并调用sed和mv? Perl神会感到受到侮辱,现在会打击你和你的孩子,直到你重写你的脚本在Perl中完成这一切。 – Ether 2010-11-05 00:23:43

回答

0

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

1

双引号内的所有变量都会被内插,特别是您在bash for循环中使用的$file。我们没有足够的上下文来知道其他变量($mov0to$basedir)来自哪里或它们包含什么,因此它们可能会遇到同样的问题。双引号也在sed部分吃掉你的反斜杠。

Andy White是对的,如果bash命令是在一个单独的脚本中,那么你就不会有太多的混乱。

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');