2010-11-05 305 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');