Понадобилось переименовать кучу файлов в переходя по директориям. Такое задание давали, когда принимали на работу, но я как то отморозился от него. А тут пришлось сделать. Нашел в книге по shell'у пример про переименование файлов и вывод дерева катологов. Соедив вместе получилось вот такое:
#!/bin/sh
search () {
for dir in `echo *`
do
if [ -d "$dir" ] ; then # ==> Если это каталог (-d)...
zz=0 # ==> Временная переменная, для сохранения уровня вложенности каталога.
while [ $zz != $deep ] # Keep track of inner nested loop.
do
zz=`expr $zz + 1` # ==> Нарастить zz.
done
if cd "$dir" ; then # ==> Если можно войти в каталог...
deep=`expr $deep + 1` # ==> Нарастить уровень вложенности.
search # рекурсия ;-)
numdirs=`expr $numdirs + 1` # ==> Нарастить счетчик каталогов.
fi
fi
done
##################переименовываем
for i in `ls | grep -e ".*\.tt"`
do
name=`echo "$i" | sed 's/ШАБЛОН_ДЛЯ_ЗАМЕНЫ/ЧЕМ_ЗАМЕНЯЕМ/'`
mv "$i" "$name" #если нужно оставить копию, то заменяем mv на cp
done
##########################################
cd .. # ==> Подняться на один уровень вверх.
if [ "$deep" ] ; then # ==> Если depth = 0 (возвращает TRUE)...
swfi=1 # ==> выставить признак окончания поиска.
fi
deep=`expr $deep - 1` # ==> Уменьшить уровень вложенности.
}
# - Main -
if [ $# = 0 ] ; then
cd `pwd` # ==> Если аргумент командной строки отсутствует, то используется текущий каталог.
else
cd $1 # ==> иначе перейти в заданный каталог.
fi
echo "Начальный каталог = `pwd`"
swfi=0 # ==> Признак завершения поиска.
deep=0 # ==> Уровень вложенности.
numdirs=0
zz=0
while [ "$swfi" != 1 ] # Пока поиск не закончен...
do
search # ==> Вызвать функцию поиска.
done
echo "Всего каталогов = $numdirs"
exit 0
запускаем его в нужной нам директории и все.