for name in /hw1/textarchive/*.pro; do
newname=${name%.pro}.txt
echo mv "$name" "$newname"
done
ou menor,
for name in /hw1/textarchive/*.pro; do
echo mv "$name" "${name%.pro}.txt"
done
(remova o echo quando tiver certeza de que está fazendo a coisa certa)
Isso itera sobre todos os arquivos .pro em /hw1/textarchive e os renomeia para .txt files. A substituição ${name%.pro} removerá a extensão .pro do final do nome em $name .
Se você quiser renomear todos arquivos:
for name in /hw1/textarchive/*; do
echo mv "$name" "${name%.*}.txt"
done
O ${name%.*} removerá qualquer extensão no final do nome. Arquivos .txt existentes também serão processados, mas não terão seus nomes alterados. Arquivos sem extensão receberão uma nova extensão .txt . Isso também selecionará nomes de arquivos que não são arquivos (como diretórios), portanto, a seguinte alteração irá ignorar estes:
for name in /hw1/textarchive/*; do
test -f "$name" || continue
echo mv "$name" "${name%.*}.txt"
done
Pode ser prudente verificar se ainda não existe uma entrada de diretório com o novo nome:
for name in /hw1/textarchive/*; do
test -f "$name" || continue
test -e "${name%.*}.txt" && continue
echo mv "$name" "${name%.*}.txt"
done
Em outra forma equivalente:
for name in /hw1/textarchive/*; do
if [ -f "$name" ] && [ ! -e "${name%.*}.txt" ]; then
echo mv "$name" "${name%.*}.txt"
fi
done
O teste -f testa a existência do arquivo regular fornecido. O teste -e testa a existência do nome dado (não importa de que seja um nome).
Esta solução não requer bash (apenas um shell sh -compatible).