많은 파일과 디렉터리의 이름을 대량으로 바꾸는 스크립트를 만들려고 합니다. 하지만 모든 파일과 하위 파일을 이동하는 데 문제가 있습니다.
지금 내 스크립트는 다음과 같습니다.
#! /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
이는 지역 변수의 개인 복사본이 필요하고 사용자의 경우와 같이 각 호출에서 고유한 값을 유지해야 하는 재귀 함수에 특히 중요합니다.