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

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

  1. #!/bin/sh
  2. #         @(#) tree      1.1  30/11/95       by Jordi Sanfeliu
  3. #                                         email: mikaku@fiwix.org
  4. #
  5. #         Начальная версия:  1.0  30/11/95
  6. #         Следующая версия:  1.1  24/02/97   Now, with symbolic links
  7. #         Исправления     :  Ian Kjos, поддержка недоступных каталогов
  8. #                           email: beth13@mail.utexas.edu
  9. #
  10. #         Tree — средство просмотра дерева каталогов (очевидно :-) )
  11. #
  12. # ==> Используется в данном документе с разрешения автора сценария, Jordi Sanfeliu.
  13. # ==> Комментарии, добавленные автором документа.
  14. # ==> Добавлено "окавычивание" аргументов.
  15. search () {
  16.    for dir in `echo *`
  17.    # ==> `echo *` список всех файлов в текущем каталоге, без символов перевода строки.
  18.    # ==> Тот же эффект дает     for dir in *
  19.    # ==> но "dir in `echo *`" не обрабатывет файлы, чьи имена содержат пробелы.
  20.    do
  21.       if [ -d "$dir" ] ; then   # ==> Если это каталог (-d)...
  22.          zz=0   # ==> Временная переменная, для сохранения уровня вложенности каталога.
  23.          while [ $zz != $deep ]    # Keep track of inner nested loop.
  24.          do
  25.             echo -n "|   "    # ==> Показать символ вертикальной связи,
  26.                               # ==> с 2 пробелами и без перевода строки.
  27.             zz=`expr $zz + 1` # ==> Нарастить zz.
  28.          done
  29.          if [ -L "$dir" ] ; then   # ==> Если символическая ссылка на каталог...
  30.             echo "+---$dir" `ls -l $dir | sed 's/^.*'$dir' //'`
  31.             # ==> Показать горизонтальный соединитель и имя связянного каталога, но...
  32.             # ==> без указания даты/времени.
  33.          else
  34.             echo "+---$dir"      # ==> Вывести горизонтальный соединитель...
  35.                                  # ==> и название каталога.
  36.             if cd "$dir" ; then  # ==> Если можно войти в каталог...
  37.                deep=`expr $deep + 1`   # ==> Нарастить уровень вложенности.
  38.                search     # рекурсия ;-)
  39.                numdirs=`expr $numdirs + 1`   # ==> Нарастить счетчик каталогов.
  40.             fi
  41.          fi
  42.       fi
  43.    done
  44.    cd ..   # ==> Подняться на один уровень вверх.
  45.    if [ "$deep" ] ; then  # ==> Если depth = 0 (возвращает TRUE)...
  46.       swfi=1              # ==> выставить признак окончания поиска.
  47.    fi
  48.    deep=`expr $deep - 1`  # ==> Уменьшить уровень вложенности.
  49. }
  50. # - Main -
  51. if [ $# = 0 ] ; then
  52.    cd `pwd`    # ==> Если аргумент командной строки отсутствует, то используется текущий каталог.
  53. else
  54.    cd $1       # ==> иначе перейти в заданный каталог.
  55. fi
  56. echo "Начальный каталог = `pwd`"
  57. swfi=0      # ==> Признак завершения поиска.
  58. deep=0      # ==> Уровень вложенности.
  59. numdirs=0
  60. zz=0
  61. while [ "$swfi" != 1 ]   # Пока поиск не закончен...
  62. do
  63.    search   # ==> Вызвать функцию поиска.
  64. done
  65. echo "Всего каталогов = $numdirs"
  66. exit 0
  67. # ==> Попробуйте разобраться в том как этот сценарий работает.