A rename
utility do Perl (*) pode ser usada para isso. Aplica um determinado comando Perl a cada nome de arquivo e renomeia o arquivo para qualquer um dos comandos para os quais o nome foi alterado.
Então, isso mudaria _1_
para _2_
em todos os arquivos que o glob corresponde.
rename 's/_1_/_2_/' devoirNote1_*_2.R
Incrementar numericamente pode ser feito com o /e
modificado para o comando de substituição, tornando a peça de substituição um trecho Perl em vez de um literal.
rename -v 's/_(\d+)_/"_" . ($1 + 1) . "_"/e' devoirNote1_*_2.R
Isso selecionaria uma parte do nome do arquivo com dígitos entre os sublinhados, capturando os dígitos para $1
e substituindo-os pelo número aumentado um, com os sublinhados adicionados de volta. -v
para o modo detalhado. Com a lista de arquivos em seu exemplo, isso imprimiria devoirNote1_1_2.R renamed as devoirNote1_2_2.R
conforme o esperado.
Os arquivos afetados são quaisquer que sejam os glob no final da linha de comando.
No entanto, se você tiver, digamos 1_1_2
e 1_2_2
, a renomeação do primeiro falhará, pois colidiria com o próximo. Isso exigiria dar os nomes dos arquivos em ordem inversa ou alterá-los para algum formato não colidido primeiro e depois para trás, por exemplo, adicionando um caractere extra.
(* não é a ferramenta de renomeação util-linux. Veja aqui e aqui )