Vou fazer um vÃdeo de arquivos de imagem, mas os nomes dos arquivos contêm números em notação cientÃfica, então a ordenação do nome não ficará correta.
Os nomes dos arquivos estão neste formato:
ABC_1.000000E-01.png ~ ABC_1.100000E+01.png,
DEF_1.000000E-01.png ~ DEF_1.100000E+01.png,
GHI_1.000000E-01.png ~ GHI_1.100000E+01.png,
.
.
.
Se eu alterar a notação numérica usada para os números, a ordem não estará correta novamente, então quero alterá-la conforme abaixo.
ABC_001.png ~ ABC_110.png,
DEF_001.png ~ DEF_110.png,
GHI_001.png ~ GHI_110.png,
.
.
.
Como posso fazer isso no meu sistema Linux?
Aqui está um script que encontrará todos os arquivos png no diretório atual e os renomeará de acordo. Lembre-se de que ele não substituirá os arquivos existentes.
Aqui está a prévia do trabalho
Antes do roteiro
Depois do roteiro
roteiro
Com
zsh
:(e remova o
-n
para funcionamento a seco, se estiver satisfeito).Semelhante com as
perl
variantes baseadas emrename
(Ã s vezes chamadasprename
ouperl-rename
para desambiguar dorename
comando (não relacionado e muito mais limitado) deutil-linux
):O paralelo entre os dois:
\d+
corresponde a um ou mais dÃgitos decimais, enquanto zsh's<->
corresponde a strings que representam qualquer número decimal (forma de<x-y>
sem limites), portanto, são essencialmente os mesmos.sprintf "%03d"
converte para inteiro e preenche com 0.$(( number|0 ))
converte para inteiro em zsh, enquanto ol[3][0]
faz o preenchimento.Diferenças:
zmv
fará verificações de sanidade (como conflitos parax_1E+2.png
vsx_10E+1.png
, por exemplo, ou arquivos de destino já existentes) antes de fazer qualquer renomeação.l
faz preenchimento, mas também trunca para a largura especificada. Assim,1.2E+3
(1200) seria truncado para200
, enquantosprintf "%03d"
o deixaria como1200
.Tente também
Ele usa
awk
para isolar e converter o número em notação cientÃfica e produzir seu valor de dez vezes como um inteiro preenchido com zero. Canalize, por exemplosh
, se estiver satisfeito com o resultado.