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

Вам необходимо установить libnl-3-200_3.2.21-1_amd64.deb, а не libnl-3-200-dbg_3.2.21-1_amd64.deb (обратите внимание на дополнительный -dbg), чтобы выполнить рекомендуемое исправление. Убедитесь, что вы загрузили правильные файлы пакетов, удалили необработанные файлы пакетов и повторите попытку.

5
задан 5 October 2017 в 12:50

2 ответа

Этот скрипт определяет функцию 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 для этой цели вместо скрипта!

7
ответ дан 18 July 2018 в 05:44

Этот скрипт определяет функцию 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 для этой цели вместо скрипта!

7
ответ дан 24 July 2018 в 18:25

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

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