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).