выполнить команду командной строки из Perl? - PullRequest
1 голос
/ 05 ноября 2010

Привет всем,

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

Ответы [ 3 ]

4 голосов
/ 05 ноября 2010

Я могу придумать много лучших способов сделать это, но в идеале вам нужен чистый 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 голос
/ 05 ноября 2010

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

Энди Уайт прав, у вас было бы меньше беспорядка, если бы команды bash были в отдельном скрипте.

0 голосов
/ 05 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...