Aqui está uma maneira crua (sem verificação de erros) para fazer isso puramente no bash:
#helper function to convert a number to the corresponding character
chr() {
[ "$1" -lt 256 ] || return 1
printf "\$(printf '%03o' "$1")"
}
#helper function to convert a character to the corresponding integer
ord() {
LC_CTYPE=C printf '%d' "'$1"
}
#increment file
fn_incr(){
#first split the argument into its constituent parts
local fn prefix letter_and_suffix letter suffix next_letter
fn=$1
prefix=${fn%_*}
letter_and_suffix=${fn#${prefix}_}
letter=${letter_and_suffix%%.*}
suffix=${letter_and_suffix#*.}
#increment the letter part
next_letter=$(chr $(($(ord "$letter") + 1)))
#reassemble
echo "${prefix}_${next_letter}.${suffix}"
}
Exemplo de uso:
fn_incr foo_bar_A.min.js
#=> foo_bar_B.min.js
Fazê-lo no bash com índices de letras múltiplas exigiria um código mais longo. Você sempre pode fazer isso em um executável diferente, mas você pode querer incrementar os nomes de arquivos em lotes, ou então a sobrecarga de inicialização do executável pode atrasar seu programa de maneira inaceitável. Tudo depende do seu caso de uso.
Usar inteiros antigos simples pode ser a melhor escolha aqui, já que você não terá que gerenciar manualmente como o 9 ++ transborda para a esquerda.
chr()
e ord()
foram descaradamente roubados de Script Bash para obter valores ASCII para o alfabeto