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

이는 지역 변수의 개인 복사본이 필요하고 사용자의 경우와 같이 각 호출에서 고유한 값을 유지해야 하는 재귀 함수에 특히 중요합니다.

관련 정보