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 find
admite, esto se puede reducir a
find . -type f -name 'file*' -exec mv {} {}_renamed \;
La xargs
versión es útil cuando no se usa {}
, como en
find .... -print0 | xargs --null rm
Aquí rm
se llama una vez (o con muchos archivos varias veces), pero no para cada archivo.
Eliminé la basename
pregunta en ti, porque probablemente esté mal: te moverías foo/bar/file8
a file8_renamed
, no foo/bar/file8_renamed
.
Ediciones (como se sugiere en los comentarios):
- Agregado acortado
find
sinxargs
- Adhesivo de seguridad agregado
x
sea inútil: lafind . -type f -name 'file*' -exec mv {} "{}_renamed" \;
xargs
versión tiene la misma eficiencia que el primer ejemplo /