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 /x
está allí solo para arreglar directamente el enfoque del autor de la pregunta.{}
directamente en unsh -c "…"
comando shell ( ); siempre debe pasarlo como argumento. (2) No todas las versiones defind
soporte de la{}_renamed
construcción. (3) No entiendo su declaración quexargs
es útil para eliminar archivos (en contraste con renombrarlos).xargs
no esmv
vs.rm
, sino el uso de{}
vs. sin. El primero es similar amv file1 file1_renamed; mv file2 file2_renamed
mientras que el segundo esrm file1 file2
.