Você está citando a expressão inteira, portanto, nenhuma interpolação de shell ocorrerá e Perl verá a expressão regular mais curiosa de "$( - "
printf "% d" $ {j} " - )"
, que é interpolada por Perl em algo como
% perl -E 'say qq{"$( - "'printf "%d" ${j}'" - )"}'
"42 640 - "'printf "%d" '" - )"
%
porque você pediu ao Perl para interpolar a variável $(
sobre a qual você pode ler via perldoc -v '$('
. Basta dizer que essa expressão regular provavelmente não corresponderá aos seus arquivos. (E demonstra uma das várias armadilhas de tentar incorporar várias linguagens em uma sequência gloriosamente complicada; realmente não há necessidade, pois a Perl pode fazer tudo isso.)
Uma abordagem melhor seria combinar e ajustar o que você está interessado, que aqui parece ser um número fechado por hypens; supondo que há apenas um número no nome do arquivo, basta combinar com isso, salvando uma referência anterior ([0-9]+)
e usando a função Perl sprintf
para preencher esses números conforme apropriado (mais o importante sinalizador /e
para tratar o lado direito como uma expressão, de modo que sprintf
seja realmente chamado).
% touch "blah - "{1..9}" - blah"
% ls
blah - 1 - blah blah - 3 - blah blah - 5 - blah blah - 7 - blah blah - 9 - blah
blah - 2 - blah blah - 4 - blah blah - 6 - blah blah - 8 - blah
% rename 's/([0-9]+)/sprintf "%02d", $1/e' *
% ls
blah - 01 - blah blah - 04 - blah blah - 07 - blah
blah - 02 - blah blah - 05 - blah blah - 08 - blah
blah - 03 - blah blah - 06 - blah blah - 09 - blah
%
Se houver números em outros lugares no nome do arquivo, faça a conta de expressão regular para isso, talvez algo como
% rename 's/- ([0-9]+) -/sprintf "- %d -", $1/e' *
% ls
blah - 1 - blah blah - 3 - blah blah - 5 - blah blah - 7 - blah blah - 9 - blah
blah - 2 - blah blah - 4 - blah blah - 6 - blah blah - 8 - blah
%
Para usar expressões regulares em rename
com mais eficiência, consulte