Книга: Искусство программирования на языке сценариев командной оболочки

Пример A-19. tree: Вывод дерева каталогов

Пример A-19. tree: Вывод дерева каталогов

#!/bin/sh

# @(#) tree 1.1 30/11/95 by Jordi Sanfeliu

# email: [email protected]

#

# Начальная версия: 1.0 30/11/95

# Следующая версия: 1.1 24/02/97 Now, with symbolic links

# Исправления : Ian Kjos, поддержка недоступных каталогов

# email: [email protected]

#

# Tree -- средство просмотра дерева каталогов (очевидно :-) )

#

# ==> Используется в данном документе с разрешения автора сценария, Jordi Sanfeliu.

# ==> Комментарии, добавленные автором документа.

# ==> Добавлено "окавычивание" аргументов.

search () {

for dir in `echo *`

# ==> `echo *` список всех файлов в текущем каталоге, без символов перевода строки.

# ==> Тот же эффект дает for dir in *

# ==> но "dir in `echo *`" не обрабатывет файлы, чьи имена содержат пробелы.

do

if [ -d "$dir" ] ; then # ==> Если это каталог (-d)...

zz=0 # ==> Временная переменная, для сохранения уровня вложенности каталога.

while [ $zz != $deep ] # Keep track of inner nested loop.

do

echo -n "| " # ==> Показать символ вертикальной связи,

# ==> с 2 пробелами и без перевода строки.

zz=`expr $zz + 1` # ==> Нарастить zz.

done

if [ -L "$dir" ] ; then # ==> Если символическая ссылка на каталог...

echo "+---$dir" `ls -l $dir | sed 's/^.*'$dir' //'`

# ==> Показать горизонтальный соединитель и имя связянного каталога, но...

# ==> без указания даты/времени.

else

echo "+---$dir" # ==> Вывести горизонтальный соединитель...

# ==> и название каталога.

if cd "$dir" ; then # ==> Если можно войти в каталог...

deep=`expr $deep + 1` # ==> Нарастить уровень вложенности.

search # рекурсия ;-)

numdirs=`expr $numdirs + 1` # ==> Нарастить счетчик каталогов.

fi

fi

fi

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

# ==> Попробуйте разобраться в том как этот сценарий работает.

Noah Friedman дал разрешение на публикацию своей библиотеки функций для работы со строками, которая, по сути, воспроизводит некоторые библиотечные функции языка C.

Оглавление книги


Генерация: 1.874. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз