Каков наилучший способ рекурсивного переименования файлов и каталогов в 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происходит перезапись и как это правильно сделать.

EDIT: Просто нужно было объявить его local, я думал, что он объявляется локальным, путем определения его внутри функции.

решение1

Переменные, используемые в функции, являются глобальными. Другими словами, если переменной присвоено значение внутри функции, ее значение может быть доступно вызывающему. Если вы хотите объявить переменную, которая используется только внутри функции и не должна быть доступна вызывающему, эта переменная должна быть объявлена local​​. Например, вы можете поместить следующую дополнительную строку в начало вашей функции _recursivename:

local currentpath

Это особенно важно для рекурсивных функций, которым необходимо иметь собственные копии локальных переменных и сохранять уникальные значения при каждом вызове, как в вашем случае.

Связанный контент