A seguir, é uma correção direta da sua abordagem:
find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}_renamed"' \;
No entanto, isso é muito caro se você tiver muitos arquivos correspondentes, porque você inicia um shell novo (que executa a mv) para cada correspondência. E se você tiver caracteres engraçados em qualquer nome de arquivo, isso explodirá. Uma abordagem mais eficiente e segura é a seguinte:
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
Ele também tem o benefício de trabalhar com arquivos com nomes estranhos. Se for findcompatível, isso pode ser reduzido para
find . -type f -name 'file*' -exec mv {} {}_renamed \;
A xargsversão é útil quando não estiver sendo usada {}, como em
find .... -print0 | xargs --null rm
Aqui rmé chamado uma vez (ou com muitos arquivos várias vezes), mas não para todos os arquivos.
Eu removi a basenamepergunta em você, porque provavelmente está errado: você mudaria foo/bar/file8para file8_renamed, não foo/bar/file8_renamed.
Edições (como sugerido nos comentários):
- Adicionado encurtado
findsemxargs
- Etiqueta de segurança adicionada
xé inútil: afind . -type f -name 'file*' -exec mv {} "{}_renamed" \;xargsversão tem a mesma eficiência do primeiro exemplo / /