Quiero cambiar el nombre de varios archivos (archivo1... archivoN a archivo1_renombrado... archivoN_renombrado) usando find
comando:
find . -type f -name 'file*' -exec mv filename='{}' $(basename $filename)_renamed ';'
Pero obteniendo este error:
mv: cannot stat ‘filename=./file1’: No such file or directory
Esto no funciona porque el nombre de archivo no se interpreta como una variable de shell.
Respuesta aceptada:
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 shell nuevo (que ejecuta un mv
) para cada partido. Y si tiene personajes 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 find
lo admite, esto se puede reducir a
find . -type f -name 'file*' -exec mv {} {}_renamed \;
Los xargs
La 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 todos los archivos.
Eliminé el basename
en su pregunta, porque probablemente esté mal:movería foo/bar/file8
a file8_renamed
, no foo/bar/file8_renamed
.
Ediciones (como se sugiere en los comentarios):
- Se agregó
find
abreviado sinxargs
- Pegatina de seguridad agregada