我正在尝试制作一个脚本来批量重命名大量文件和目录。但我无法让它在每个文件和子文件中移动。
我现在的剧本是这样的
#! /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
当它到达目录树的底部并且必须返回,currentpath
已被覆盖并且不会返回开始寻找第二个子目录时,它会中断。
我不明白为什么currentpath
会被覆盖,或者如何正确地做到这一点。
编辑:只需要声明它local
,我认为它是通过在函数中定义它来声明的。
函数中使用的变量是全局变量。换句话说,如果一个变量在函数中被赋值,它的值就可以被调用者访问。如果要声明一个仅在函数内使用且不应被其调用者访问的变量,则应声明该变量
local
。例如,您可以在函数的开头添加以下额外行_recursivename
:这对于需要拥有其局部变量的私有副本并且需要在每次调用中保持唯一值的递归函数尤其重要,就像您的情况一样。