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, currentpath
foi 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.