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 find
compatível, isso pode ser reduzido para
find . -type f -name 'file*' -exec mv {} {}_renamed \;
A xargs
versã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 basename
pergunta em você, porque provavelmente está errado: você mudaria foo/bar/file8
para file8_renamed
, não foo/bar/file8_renamed
.
Edições (como sugerido nos comentários):
- Adicionado encurtado
find
semxargs
- Etiqueta de segurança adicionada
x
é inútil: afind . -type f -name 'file*' -exec mv {} "{}_renamed" \;
xargs
versão tem a mesma eficiência do primeiro exemplo / /