Lote / Multi renomear apenas arquivos com um intervalo de numeração específico

4

Eu tenho uma situação em que tenho o seguinte:

file01.ext
.
.
.
file99.ext
file100.ext
.
.
.

E eu quero (usando renomear) inserir o '0' para os arquivos 01-99 (para que eles se tornem 000-099), mas não modificar arquivos maiores que 100. Qual expressão devo usar e o que é uma boa fonte em aprender expressões regulares como essas?

No Windows, eu teria usado a função multi rename do Total Commander, que tem uma sintaxe de renomeação muito simples. Existem algumas boas alternativas para essa ferramenta (multi-renomeação) para o Ubuntu?

    
por user300704 15.12.2014 / 08:01

2 respostas

5

Usando rename

Uma ferramenta geralmente útil para este tipo de atividade é rename do pacote perl . Aplica uma substituição por perl ao nome do arquivo:

rename 's/file/file0/' file[0-9][0-9].ext

Como isso funciona:

  • s/file/file0/

    Este é um comando perl de substituição. Ele substitui a ocorrência de file em um nome de arquivo por file0 .

  • file[0-9][0-9].ext

    Esta é a lista de arquivos em que rename deve operar. [0-9] significa qualquer número de 0 a 9. [0-9][0-9] significa quaisquer dois números, um após o outro.

A página manpage de rename é aqui .

Observação: isso requer a versão perl de rename . Há também um rename utility que faz parte de util-linux , mas funciona diferentemente.

Usando bash

Essa abordagem usa um loop for combinado com a substituição do padrão :

for f in file[0-9][0-9].ext; do mv "$f" "${f/file/file0}"; done

Como funciona:

  • for f in file[0-9][0-9].ext; do

    Isso inicia um loop sobre cada nome de arquivo que corresponde ao glob file[0-9][0-9].ext .

  • mv "$f" "${f/file/file0}"

    Isso renomeia os arquivos usando a substituição de padrões do bash . Ele substitui file por file0 'no nome do arquivo.

  • done

    Isso marca o final do loop for .

Essa abordagem requer bash (ou outro shell avançado).

bash é o shell interativo padrão e essa abordagem funcionará em bash . Assim, isso deve funcionar na linha de comando usual.

    
por John1024 15.12.2014 / 08:24
1

Isso renomeia usando regex diferente:

rename -n 's/[^0-9](([0-9]){2})\.ext$/0$1.ext/' *

[^0-9](([0-9]){2})\.ext$ Corresponde a qualquer% não dígito[^0-9] seguido por grupo de números com comprimento = 2, que termina com .ext . Portanto, na peça de reposição, adicione um 0 e imprime o grupo de $1 correspondente e, em seguida, sua extensão.

Ou alternativa para regex:

rename -n 's/[^\d](\d{2})\.ext$/0$1.ext/' *

\d corresponde a um número.

    
por devWeek 15.12.2014 / 08:55