La siguiente es una solución directa de su enfoque:
find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}_renamed"' \;
Sin embargo, esto es muy costoso si tiene muchos archivos coincidentes, porque inicia un nuevo shell (que ejecuta a mv) para cada coincidencia. Y si tiene caracteres divertidos en cualquier nombre de archivo, esto explotará. Un enfoque más eficiente y seguro es este:
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
También tiene la ventaja de trabajar con archivos con nombres extraños. Si lo findadmite, esto se puede reducir a
find . -type f -name 'file*' -exec mv {} {}_renamed \;
La xargsversión es útil cuando no se usa {}, como en
find .... -print0 | xargs --null rm
Aquí rmse llama una vez (o con muchos archivos varias veces), pero no para cada archivo.
Eliminé la basenamepregunta en ti, porque probablemente esté mal: te moverías foo/bar/file8a file8_renamed, no foo/bar/file8_renamed.
Ediciones (como se sugiere en los comentarios):
- Agregado acortado
findsinxargs
- Adhesivo de seguridad agregado
xsea inútil: lafind . -type f -name 'file*' -exec mv {} "{}_renamed" \;xargsversión tiene la misma eficiencia que el primer ejemplo /