Самый простой вариант сделать прсто на файнд, единственное что в вашем примере всего два варианта по этому нет делать никаких циклов проще два раза прогнать условие. Для тестов замени mv на cp или тестовой папочке.
find . -type f -name '[0-9][0-9]\.txt' -exec bash -c 'mv $0 0${0#./}' {} \;
find . -type f -name '[0-9]\.txt' -exec bash -c 'mv $0 00${0#./}' {} \;
Вывод до
[bitrix@centos-4gb-hel1-1 test]$ ls
10.txt 1.txt 2.txt 333.txt
Вывод после
[bitrix@centos-4gb-hel1-1 test]$ ls
001.txt 002.txt 010.txt 333.txt
find
-поиск рекурсивный
.
где
-type f
- только файлы
-name
- имя файла в данном сулчае ругулярка
-exec
выполнить с найденм, опция самого find
-bash -
bash ( поскольку нам нужно удалить ./ из имени файла а сам find это может сделать но нам нужно и оставить предидущий вариант для mv а тут уже все )
{}
подставить в exec вывод find
\;
экранируем и закрываем find
А еще лучше скажите для чего вы это делаете, возможно мы идем не тем путем.