Объяснение сценария оболочки для рекурсивной печати полного дерева каталогов

Я нашел, что сценарий рекурсивно распечатал полное дерево каталогов, но я не могу понять это. Кто-либо может полностью описать это? Я только что запустил сценарии оболочки. Вот код:

#!/bin/bash
walk() {
        local indent="${2:-0}"
        printf "%*s%s\n" $indent '' "$1"
        for entry in "$1"/*; do
                [[ -d "$entry" ]] && walk "$entry" $((indent+4))
        done
}
walk "$1"
6
задан 5 October 2017 в 02:50

1 ответ

Этот сценарий определяет функцию walk() и затем выполнения walk на первом аргументе, переданном сценарию.

Функция сначала определяет локальную переменную (одно известное только к функции и ее детям) indent

indent локально определено как "${2:-0}". Это означает это если $2 (второй аргумент, полученный walk команда), сброшен, затем сделайте ее 0. Эта переменная local так, чтобы Вы не могли передать второй аргумент сценарию сами.

Функция затем печатает содержание каталога, указанного на командной строке ($1) в этом формате

printf "%*s%s\n" $indent '' "$1"

Это означает, печать $indent количество пробелов, затем распечатайте название каталога как строка (таким образом, число не ожидается), затем распечатайте новую строку.

Затем функция выполняет цикл

for entry in $1/*; do

Это присваивает каждый нескрытый файл или подкаталог в $1 (каталог, указанный как первый аргумент walk) к переменной entry и циклы по ним, выполняя эту команду на них:

[[ -d "$entry" ]] && walk "$entry" $((indent+4))

Это означает, если entry каталог, затем запущенный walk на entry. Теперь walk имеет второй аргумент $((indent+4)), который будет использоваться вместо 0 как новое значение indent. Эффект этого состоит в том, что первый каталог уровня не располагается с отступом вообще, но вторые каталоги уровня располагаются с отступом 4 пробелов, третьи пробелы уровня 8, и т.д. С тех пор entry теперь первый аргумент, $1 из walk функция, это рекурсивно вызовет всюду по структуре.

Сценарий заканчивается путем выполнения walk функция на позиционном параметре $1, первый аргумент передал сценарию. Использование могло быть

./script directory

Это означает directory $1и walk будет работаться directory.

Было бы хорошо, если бы сценарий распечатал регулярные файлы, я думаю, но они выглядели бы сбивающими с толку без некоторого тщательно продуманного форматирования. Я рекомендую использовать tree с этой целью вместо сценария!

8
ответ дан 23 November 2019 в 07:37

Другие вопросы по тегам:

Похожие вопросы: