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