全部,
我需要从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
谢谢, 扬
答案 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代码中编写循环/逻辑,如果需要,可以进行更简单的系统调用。