Acredite que isso deve funcionar para você (provavelmente maneiras mais elegantes de fazer isso com sed).
for file in *; do
base='echo "${file%.*}"'
mv -- "${file}" "${base}.txt"
done
Se eu tiver um diretório de arquivos, onde alguns arquivos têm uma extensão como .html e alguns arquivos não têm extensão, como alterá-los todos para, por exemplo, .txt?
Não necessariamente mais elegante, mas para fins de conclusão, aqui está uma solução sed
:
for file in *; do
mv "$file" "$(echo "$file" | sed 's/^\(.*\)\.\?.*$/.txt/')"
done
O sed bit pega tudo antes do último ponto no nome do arquivo, e substitui o ponto e o que vem depois com '.txt'. Se não houver ponto no nome do arquivo, '.txt' será anexado à coisa toda.
As aspas ao redor das variáveis são importantes para manipular nomes de arquivos com espaços e tal, independentemente de qual método você usar.
Para renomear todos eles no shell, seria algo assim:
for file in *; do
mv -- "${file}" "'basename -- "${file}"'.txt"
done
Você pode querer testar o tipo com file
ou outras verificações para determinar as extensões.