Você poderia fazer isso com um loop de shell como:
for f in *.jpeg *.png
do printf "mv '%s' pic%05d.%s \n" "$f" $((++c)) "${f##*.}"
done | sh
Este programa cria uma única sequência com uma execução de um número de série e mantém a extensão do arquivo original.
Nota: A técnica para criar os comandos ou sequências de comando e canalizar o resultado em um shell é um padrão de codificação padrão. Você pode executar o programa primeiro sem o pipe final em sh
para inspecionar se os comandos criados se encaixam e se tudo parece bem acrescentar o pipe final. (Ao contrário de adicionar temporariamente um echo
(como visto com frequência), o método pipe-into-shell cria uma saída consistente .
Mas observe (como Gilles apurou) que no caso dado, um nome de arquivo contendo aspas simples criará para o respectivo nome de arquivo um resultado incorreto. Se você não precisa do recurso de pré-inspeção, você pode executar diretamente os comandos, como em:
for f in *.jpeg *.png
do
((++c))
new_f=$( printf "pic%05d.%s" $c "${f##*.}" )
mv "${f}" "${new_f}"
done
(Para o paranóico: Claro que sempre pode haver situações em que essas soluções também não funcionem como pretendido; por exemplo, se alguns dos arquivos existentes já estiverem em conformidade com o formato de nome de arquivo de destino; nesse caso, por exemplo, crie / mova os arquivos para um novo diretório temporário para evitar a corrupção dos respectivos arquivos.)