2010-11-05 7 views
1

HI все,выполнить команду командной строки из 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

ответ

0

Это, скорее всего, проблема с вложенными кавычками. Я бы рекомендовал либо переместить эту команду bash в свой собственный файл сценария (bash), либо написать цикл/логику непосредственно в коде Perl, делая более простые системные вызовы, если вам нужно.

1

Все переменные в двойных кавычках будут интерполированы, $file, которые вы используете в bash для цикла в частности. Нам не хватает контекста, чтобы узнать, где другие переменные ($mov0to и $basedir) исходят или содержат то, что они могут иметь одинаковые проблемы. Двойные кавычки также едят ваши обратные косые черты в седловой части.

Энди Уайт прав, у вас было бы меньше беспорядка, если команды 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'); 
Смежные вопросы