Estoy intentando crear un script para cambiar el nombre de muchos archivos y directorios de forma masiva. Pero tengo problemas para moverlo por cada archivo y subarchivo.
Mi guión ahora mismo es este
#! /bin/bash
function _setname {
for file in "$@"
do
oldname=$(basename "${file}")
newname=$(echo "${oldname}" | tr '?%*:|' '_' )
echo "${newname}"
[ ! "${oldname}" = "${newname}" ] && mv "${oldname}" "${newname}"
done
}
function _recursivename {
for file in "$@"
do
currentpath="$(pwd)"
cd "$(dirname ${file})"
oldname="$(basename ${file})"
newname="$(_setname ${oldname})"
[ -d "${newname}" ] && _recursivename ./"${newname}"/*
cd "${currentpath}"
done
}
_recursivename "${@}"
exit
Se rompe cuando llega al final de un árbol de directorios y tiene que volver a subir, currentpath
se ha sobrescrito y no vuelve al principio para buscar un segundo subdirectorio.
No entiendo por qué currentpath
se sobrescribe ni cómo hacerlo correctamente.
EDITAR: Solo tenía que declararlo local
, pensé que se declaraba local definiéndolo dentro de una función.
Respuesta1
Las variables utilizadas en una función son globales. En otras palabras, si a una variable se le asigna un valor dentro de una función, la persona que llama puede acceder a su valor. Si desea declarar una variable que se usa solo dentro de la función y a la que no debe acceder su llamador, esta variable debe declararse local
. Por ejemplo, puedes poner la siguiente línea adicional al comienzo de tu función _recursivename
:
local currentpath
Esto es especialmente importante para funciones recursivas que necesitan tener copias privadas de sus variables locales y que necesitan mantener valores únicos en cada invocación, como en su caso.