Для устранения неполадок скрипта попробуйте заменить mv на echo. Вы увидите, что ваша переменная ${num} содержит полное имя файла, например. [F8]. Следовательно, ваш сценарий по существу пытается запустить
mv ./2.pdb.ostat.pdb.ostat ./2.pdb.ostat.ostat
Вместо этого вы должны сначала усечь имя файла только до номера. например,
for filename in ./*; do num="$(echo "${filename}" | grep -o '^./[0-9]*')"; echo "${num}.pdb.ostat" "${num}.ostat"; done
После подтверждения синтаксиса все в порядке, вы можете изменить echo на mv и фактически переместить файлы. т.е.
for filename in ./*; do num="$(echo "${filename}" | grep -o '^./[0-9]*')"; mv "${num}.pdb.ostat" "${num}.ostat"; done
Тем не менее, самый простой способ - использовать (perl) rename.
rename 's/pdb.//' *.pdb.ostat –
Подробнее см. man rename. [ ! d6]