Я пытаюсь создать скрипт для переименования большого количества файлов и каталогов. Но мне трудно заставить его перемещаться по каждому файлу и подфайлу.
Мой сценарий сейчас такой:
#! /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
, я думал, что он был объявлен локальным, определив его внутри функции.
Переменные, используемые в функции, являются глобальными. Другими словами, если переменной присваивается значение в функции, вызывающая сторона может получить к ней доступ. Если вы хотите объявить переменную, которая используется только внутри функции и не должна быть доступна ее вызывающей, эта переменная должна быть объявлена local
. Например, вы можете поместить следующую дополнительную строку в начало вашей функции _recursivename
:
local currentpath
Это особенно важно для рекурсивных функций, которым необходимо иметь свои частные копии своих локальных переменных и которым необходимо сохранять уникальные значения в каждом вызове, как в вашем случае.