Qual é a melhor maneira de renomear arquivos e diretórios recurivamente no bash?

Qual é a melhor maneira de renomear arquivos e diretórios recurivamente no bash?

Estou tentando criar um script para renomear vários arquivos e diretórios em massa. Mas estou tendo problemas para passar por todos os arquivos e subarquivos.

Meu script agora é esse

#! /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

Ele quebra quando chega ao final de uma árvore de diretórios e precisa subir novamente, currentpathfoi sobrescrito e não retorna ao início para procurar um segundo subdiretório.

Não entendo por que currentpathé substituído ou como fazê-lo corretamente.

EDIT: Só tive que declará-lo local, pensei que fosse declarado local definindo-o dentro de uma função.

Responder1

As variáveis ​​usadas em uma função são globais. Em outras palavras, se for atribuído um valor a uma variável dentro de uma função, seu valor poderá ser acessado pelo chamador. Se você deseja declarar uma variável que é usada apenas dentro da função e não deve ser acessível por seu chamador, esta variável deve ser declarada local. Por exemplo, você pode colocar a seguinte linha extra no início da sua função _recursivename:

local currentpath

Isto é especialmente importante para funções recursivas que precisam ter cópias privadas de suas variáveis ​​locais e que precisam manter valores únicos em cada invocação, como no seu caso.

informação relacionada