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

Я не понимаю, почему currentpath перезаписывается, или как это сделать правильно.

РЕДАКТИРОВАТЬ: Просто нужно было объявить его local, я думал, что он был объявлен локальным, определив его внутри функции.

1
задан 12 June 2019 в 13:28

1 ответ

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

local currentpath

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

0
ответ дан 12 June 2019 в 13:28

Другие вопросы по тегам:

Похожие вопросы: