Você pode usar o comando prename para renomear arquivos com base em uma transformação escrito em Perl .
Vamos começar de maneira simples. Para renomear todos os arquivos .jpg em um diretório, alterando todos os - para _ , podemos apenas usar o s operator (também poderíamos usar tr ). O código Perl é executado para transformar cada nome de arquivo.
prename 's!-!_!g' *.jpg
Para alterar a (s) sequência (s) numérica (s) no final para um contador simples, introduzimos uma variável de contador. Eu uso a variável global $a como um contador (a introdução de variáveis extras é mais complicada). A expressão regular (\.[^/.]*)$ corresponde à extensão do arquivo e $1 no texto substituto representa o que o grupo entre parênteses correspondeu.
prename 's!-!_!g; ++$a; s!_[0-9_]+(\.[^/.]*)$!_$a$1!' *.jpg
Observe que os arquivos são renomeados na ordem dada pelos argumentos do nome do arquivo, ou seja, a ordem de expansão de *.jpg determina a numeração dos arquivos.
Como alternativa, podemos inicializar o contador explicitamente com um bloco BEGIN .
prename 'BEGIN {$a = 1;} s!-!_!g; s!_[0-9_]+(\.[^/.]*)$!_$a$1!; ++$a;' *.jpg
Para realizar isso em todos os subdiretórios do diretório atual, chame find .
find -type d -exec sh -c 'cd "$1" && prename "$0" *.jpg' 's!-!_!g; ++$a; s!_[0-9_]+(\.[^/.]*)$!_$a$1!' {} \;