Uma palavra que começa com um traço é geralmente considerada como uma opção. Quando você executa ls * , o comando ls recebe ls 001.png -002.png ... e vê -002.png como um conjunto de opções que não entende. O mesmo para muitos comandos como cp , mv , ...
Solução # 1: prefixar os arquivos com o caminho deles. Funcionará em todos os casos.
ls ./*
Solução # 2: muitos comandos, especialmente no mundo GNU, aceitam um duplo traço como parâmetro, indicando que o que segue não são opções
ls -- *
No entanto, os traços iniciais não afetarão você for loop.
Quanto ao "valor muito grande para a base", é devido a -008 ser considerado como um número octal porque começa com um 0. No entanto, 8 não é um dígito octal válido. Uma solução rápida seria usar bc :
printf -v basename_new %04d "$(bc <<< "${basename} + 10")"
Você emite com if é causado por um basename_new vazio e desaparecerá com a correção acima.