2010-11-05 6 views
1

Salut à tous,exécuter la commande de ligne de commande à partir de Perl?

je dois avoir cette commande de ligne de commande exécutée à partir d'un fichier Perl:

for file in *.jpg ; do mv $file `echo $file | sed 's/\(.*\.\)jpg/\1jp4/'` ; done 

J'ajouté les dossiers et essayé:

system "bash -c 'for file in $mov0to/*.jp4 ; do mv $file `echo $basedir/internal/0/$file | sed 's/\(.*\.\)jp4/\1jpg/'` ; done'"; 

Mais tout ce que je reçois est :

sh: Syntax error: "(" unexpected 
No file specified 

Je suis sur Kubuntu 10.4

Merci, Jan

+4

Tu décides de courir pour une boucle et d'appeler sed et mv? Les dieux Perl se sentent insultés et vont maintenant vous frapper, vous et vos enfants, jusqu'à ce que vous réécriviez votre script pour faire tout cela en Perl. – Ether

Répondre

0

Il est très probablement un problème avec des citations imbriquées. Je recommande de déplacer cette commande bash dans son propre fichier de script (bash), ou d'écrire la boucle/logique directement dans le code Perl, en faisant des appels système plus simples si nécessaire.

1

Toutes les variables à l'intérieur des guillemets doubles seront interpolées, le $file que vous utilisez dans la boucle bash for en particulier. Nous n'avons pas assez de contexte pour savoir d'où viennent les autres variables ($mov0to et $basedir) ou ce qu'elles contiennent, donc elles pourraient avoir les mêmes problèmes. Les doubles guillemets mangent aussi vos antislashs dans la partie sed.

Andy White a raison, vous auriez moins de désordre si les commandes bash étaient dans un script séparé.

4

Je peux penser à beaucoup de meilleures façons de le faire, mais idéalement vous voulez pur 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; 

Si vous insistez pour le faire la levée de Bash, vous devez faire:

system qq(bash -c 'for file in $mov0to/*.jp4 ; do mv \$file $basedir/internal/0/\${file\/%.jp4\/.jpg} ; done'); 
Questions connexes