在 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

這對於需要擁有局部變數的私有副本並且需要在每次呼叫中保留唯一值的遞歸函數尤其重要,就像您的情況一樣。

相關內容