Oi, Marcelo.
Sempre que aparece a necessidade de normalizar o nome de arquivos, lembro de como isso pode ser mais complicado do que parece à primeira vista :-/
Às vezes queremos apenas remover pontos, como no caso, mas às vezes queremos substituir um conjunto de caracteres, alterar case, limpar acentos e cedilhas; às vezes apenas nos nomes dos arquivos, às vezes incluindo os diretórios na jogada. Muitas vezes com espaços em branco. Às vezes em poucos arquivos, às vezes em centenas, senão milhares. Com caracteres em um charset diferente do usado no terminal. Arquivos que, renomeados, podem conflitar com outros já existentes. Filesystem case insensitive é outro complicador em potencial.
O Alfredo e o Julio mostraram uma forma bastante sintética e direta de fazer isso usando os comandos rev, sed e cut. De fato é como provavelmente faremos, principalmente interagindo com o terminal em tempo real :)
No curso altamente recomendado de Programação Shell Linux do Julio e do Rubens, um dos focos é a performance. Logo fica muito evidente a vantagem dos comandos builtin do shell em relação aos externos no que diz respeito à velocidade. Mesmo algoritmos um pouco mais complexos podem resultar em uma execução drasticamente(!) mais rápida se utilizarem recursos nativos do shell ao invés de externos.
Desejando renomear apenas os arquivos (não os diretórios), uma solução envolvendo apenas comandos nativos do bash seria nessa linha: (não está
descartado o uso de nomes mais adequados para as variáveis :-p)Na função, o cut e sed
foram substituídos por sequências de expansão de parâmetro com
resultado equivalente. A diferença dessas expansões em relação aos
comandos externos vai além da sintaxe: enquanto um comando externo
precisa ser lido de uma mídia com IO possivelmente comprometido, a
expansão de parâmetros é executada diretamente na pilha de variáveis do shell, que
já está e continua na RAM. Dependendo das condições de execução, a velocidade de uma sequência de builtins justificará sua aparência extensa.