В Лабораторной работе 3 вы познакомитесь с функциями, циклами и массивами. Ход работы:
-
Склонировать репозиторий.
-
Создать файл
script.bash -
Реализовать в файле
script.bashфункцию, которая будет выводить в определенном формате в стандартный вывод дерево директорий и файлов для заданного пути и их количество. -
Загрузить решение на
GH.
Warning! Для тестирования написанной вами программы будет использоваться абстрактная иерархия файлов и директорий ./dir.
Вывести все директории и файлы по заданному пути. В конце на новой строке вывести количество директорий и файлов (смотрите пример выходных данных, либо вывод утилиты tree без параметров).
Attention! Запрещено использовать утилиту tree.
Едининственный аргумент скрипта путь в виде (путь может отличаться от представленного примера)
bash script.bash .В стандартный вывод вывести структуру в виде
.
├── abc
├── aberdeen
│ ├── aa
│ │ ├── aa
│ │ │ └── aaa.txt
│ │ ├── aaa
│ │ │ ├── ability
│ │ │ │ ├── abc
│ │ │ │ ├── abilities
│ │ │ │ │ ├── aa.txt
│ │ │ │ │ └── ab
│ │ │ │ │ └── abandoned.pdf
│ │ │ │ ├── ability
│ │ │ │ │ └── aberdeen
│ │ │ │ └── ab.txt
│ │ │ └── ab.pdf
│ │ └── aaa.doc
│ ├── aa.jpg
│ └── ab
│ └── aa.jpeg
└── abilities
└── aaa.txt
10 directories, 12 filesHint! Необходимо прописать export LANG=en_US.UTF-8
Hint!
#1 Подсказки по использованию инструментов языка.
МАССИВЫ.
Создание массива со всеми поддиректориями текущей директории
subdirs=(root/*) # Внутри будет ( root/five root/one root/six )
Количество поддиректорий
subdir_count=${#subdirs[@]}
Вывести поддиректорию i
echo ${subdirs[i]}
Удаление части строки
поиск подстроки ведется сначала строки
echo ${subdirs[@]##*/} # Output: ( five one six )
поиск подстроки ведется с конца строки
echo ${subdirs[@]%%*/} # Output: ( root root root )
КОДИРОВКИ (Да, даже если вы не видите символы, они могут быть разными :) ).
Рекомендуем поисследовать различные тексты, которые вы видите в терминале в, например, этом сервисе.
А также прочитать про кодировки.
Это совершенно точно сэкономит массу вашего времени и нервов в будущем :)
Так, существует множество представлений символов. Например, в Unicode, необходимые нам символы имеют вид
printf "\u2502" # │
printf "\u251c" # ├
printf "\u2500" # ─
printf "\u2514" # └
printf "\u00A0" # non-breaking space
printf "\u0020" # space
printf "\n" # перенос строки (в linux)
Например, если нужно вывести вот это
│ └── two
лучшим способ сделать это будет
printf "\u2502\u00A0\u00A0\u0020\u2514\u2500\u2500\u0020 two"
#2 Алгоритм.
Поисследовав утилиту tree и проанализировав ее вывод в Unicode декодере (ссылка выше), становится понятно, что любая строка состоит из ${parent}${child}${name}
Например,
│ │ │ │ ├── four.jpg
здесь
${parent} =
│ │ │ │
${child} =
├──
${name} =
four.jpg