Você pode usar awk para isso:
for f in *; do
mv "$f" $(echo "$f" | awk -F, '{OFS=",";gsub(/_/, ":", $NF)}1')
done
Isso substituirá o _ por : , mas somente no último campo delimitado por , :
-
-F,conjuntosawks delimitador para, -
OFS=",";define o separador de campo de saída como, -
gsub(...)substitui todo_por:no último campo$NF - O
1no final é uma condição verdadeira, em queawkimprime a linha inteira.
Editar : no Solaris, você precisa usar nawk (que é o único awk no sistema Solaris que possui a função gsub() ) em vez do antigo awk :
for f in *; do
mv "$f" $(echo "$f" | nawk -F, '{OFS=",";gsub(/_/, ":", $NF)}1')
done
Editar 2 : para arquivos cujo mtime seja mais recente que 30 dias:
for f in *; do
[ $(stat -c %Y "") -gt $(expr $(date +%s) - 30 \* 86400) ] && \
mv "$f" $(echo "$f" | nawk -F, '{OFS=",";gsub(/_/, ":", $NF)}1')
done