Como usar o comando rename com printf

0

Como eu estava tentando consertar os números de episódio de uma série de TV eu brinquei com a função renomear e tentando passar o retorno de printf como os parâmetros de renomeação, mas não consegui fazer isso. Eu tentei quase todas as combinações de

for j in $(seq 1 9);
do 
    rename 's/"$( - "'printf "%d" ${j}'" - )"/"$( - "'printf "0%d" ${j}'" - )"/g' *
done

que eu poderia pensar, mas nada parecia funcionar. Acabei fazendo isso manualmente, já que eu estava preocupado apenas com 1-9 neste caso, então

rename 's/- 1 -/- 01 -/g' *
rename 's/- 2 -/- 02 -/g' *
...

Alguém pode apontar porque o acima não funcionou para referência futura?

    
por Darren Rodriguez 28.10.2017 / 01:53

1 resposta

3

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

por 28.10.2017 / 02:17