Eu acredito que este programa fará o que você quiser. Eu testei e funciona em vários casos interessantes (como nenhuma extensão):
#!/bin/bash
for fname in *; do
name="${fname%\.*}"
extension="${fname#$name}"
newname="${name//./_}"
newfname="$newname""$extension"
if [ "$fname" != "$newfname" ]; then
echo mv "$fname" "$newfname"
#mv "$fname" "$newfname"
fi
done
O principal problema que você teve foi que a expansão ##
não estava fazendo o que você queria. Eu sempre considerei a expansão dos parâmetros shell no bash como uma espécie de arte negra. As explicações no manual não estão completamente claras, e elas não têm nenhum exemplo de como a expansão deve funcionar. Eles também são bastante enigmáticos.
Pessoalmente, eu teria escrito um pequeno script em sed
que mexeu no nome da maneira que eu queria, ou escrevi um pequeno script em perl
que acabou de fazer a coisa toda. Uma das outras pessoas que responderam adotou essa abordagem.
Uma outra coisa que gostaria de salientar é o meu uso de citações. Toda vez que faço algo com shell scripts, lembro às pessoas que tenham muito cuidado com suas citações. Uma grande fonte de problemas em scripts de shell é o shell interpretando coisas que não deveriam. E as regras de cotação estão longe de ser óbvias. Eu acredito que este script de shell está livre de problemas de cotação.