Para uma solução bash, veja esta visão geral da remoção da substring .
#!/bin/bash
for f in *car*; do
[[ ${f##*.} == "fasta" ]] && continue
f_no_ext="${f%%.*}"
if [[ -e "${f_no_ext}.fasta" ]]; then
echo "Not moving $f because it would clobber ${f_no_ext}.fasta"
continue
fi
mv "$f" "${f_no_ext}.fasta"
done
exit
Isso faz um loop em todos os arquivos *car*
e os renomeia para uma extensão .fasta, pulando aqueles que já terminam em .fasta. Acho que outras soluções podem estar negligenciando essa etapa.
EDIT: Adicionei o bloco if
para verificar se o arquivo com extensão .fasta já existe para evitar a substituição de arquivos. Por exemplo, se você tiver car.txt e car.fasta.