¿Cuál es la mejor manera de cambiar el nombre de archivos y directorios de forma recursiva en bash?

¿Cuál es la mejor manera de cambiar el nombre de archivos y directorios de forma recursiva en bash?

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, currentpathse ha sobrescrito y no vuelve al principio para buscar un segundo subdirectorio.

No entiendo por qué currentpathse 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.

información relacionada