Itere sobre os nomes dos arquivos e use a expansão Parâmetro para conversão:
for f in *.*.*.txt; do i="${f%.txt}"; echo mv -i -- "$f" "${i//./_}.txt"; done
O padrão de expansão de parâmetro, ${f//./_}
, substitui todos os .
s por _
s no nome do arquivo ( $f
).
O texto acima será executado em seco, para permitir a renomeação real, remover echo
:
for f in *.*.*.txt; do i="${f%.txt}"; mv -i -- "$f" "${i//./_}.txt"; done
Se você quiser lidar com qualquer extensão, não apenas .txt
:
for f in *.*.*.*; do pre="${f%.*}"; suf="${f##*.}"; \
echo mv -i -- "$f" "${pre//./_}.${suf}"; done
Após a verificação, remova echo
da ação real:
for f in *.*.*.*; do pre="${f%.*}"; suf="${f##*.}"; \
mv -i -- "$f" "${pre//./_}.${suf}"; done
Genérico, para um número arbitrário de pontos, pelo menos um:
for f in *.*; do pre="${f%.*}"; suf="${f##*.}"; \
mv -i -- "$f" "${pre//./_}.${suf}"; done