Вот что вы хотите сделать:
for name in *.$1; do
stripped_name="$(basename "$name" ".$1")"
mv "$name.$1" "$name.$2"
done
Ваш большой недостаток в том, что цикл while просто оценивает это условие, эффективно проверяя наличие файлов с именами этой формы. Он не хранит ничего в любой переменной - конечно, не что-то произвольное, как $i
. Вам также не нужно ничего экспортировать здесь. Это просто делает его видимым для дочерних процессов, которые вам не нужны.
Конечно, вы могли бы просто использовать утилиту переименования. С основным (редхат и друзья):
# Note that this will actually rename abc.foo.foo to abc.bar.foo
# since it replaces the first match.
rename .foo .bar *.foo
и с причудливым perl one (debian / ubuntu):
rename 's/.foo$/bar/' *.foo