Você pode usar a opção find de exec para (recursivamente) fazer um loop sobre todos os arquivos e, em seguida, usar substituições simples de string:
find . -type f -name "product-103*" \
-exec sh -c 'echo mv "$0" "${0/103/104}"' '{}' \;
Remova o echo quando tiver certeza de que isso é o que você deseja.
Basicamente, o que exec faz é substituir o nome de cada arquivo encontrado em {} , que é passado como um argumento para sh -c . Este argumento está disponível como $0 , portanto, o nome do arquivo. Usamos esse argumento $0 em uma chamada mv , em que o segundo argumento é o novo nome de arquivo. Aqui, 103 é substituído por 104. Observe que são necessárias aspas duplas para manipular corretamente os espaços em branco nos nomes dos arquivos.
Consulte Manipulação de strings no Guia de scripts do Bash.
Com zmv do zsh (no OS X até /bin/zsh ):
autoload -U zmv
zmv -Wn '*103*' '*104*'
Remova a opção -n quando isso acontecer.