O que se segue é 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 novo shell (que executa mv
) para cada correspondência. E se você tiver personagens engraçados em qualquer nome de arquivo, isso explodirá. Uma abordagem mais eficiente e segura é esta:
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
Também tem o benefício de trabalhar com arquivos com nomes estranhos. Se find
suportar, isso pode ser reduzido para
find . -type f -name 'file*' -exec mv {} {}_renamed \;
A versão xargs
é útil quando você não usa {}
, como em
find .... -print0 | xargs --null rm
Aqui rm
é chamado uma vez (ou com vários arquivos várias vezes), mas não para cada arquivo.
Eu removi o basename
em sua pergunta porque provavelmente está errado: você moveria foo/bar/file8
para file8_renamed
, não foo/bar/file8_renamed
.
Edições (como sugerido nos comentários):
- % abreviada
find
semxargs
- Adicionado adesivo de segurança