在 bash 上递归重命名文件和目录的最佳方法是什么?

在 bash 上递归重命名文件和目录的最佳方法是什么?

我正在尝试编写一个脚本来批量重命名大量文件和目录。但我无法让它遍历每个文件和子文件。

我现在的脚本是这样的

#! /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,我认为它是通过在函数内部定义它来声明本地的。

答案1

函数中使用的变量是全局变量。换句话说,如果在函数中为变量赋值,则其值可由调用者访问。如果要声明仅在函数内使用且不应由其调用者访问的变量,则应声明此变量local。例如,您可以在函数开头添加以下额外行_recursivename

local currentpath

这对于需要拥有局部变量的私有副本并且需要在每次调用中保留唯一值的递归函数尤其重要,就像您的情况一样。

相关内容