Рейтинг:-4

Как подсчитать все папки и подпапки в каталоге рекурсивным способом

флаг in

Задача: Выводом при запуске файла будет количество подкаталогов (считая все подкаталоги в дереве) во введенном каталоге.

Я знаю, как рекурсивно использовать директорию но как я могу подсчитать все эти числа в файле сценария оболочки?

флаг us
Это домашнее задание?
флаг in
Да, это домашнее задание, и я искал в Интернете, но ничего не нашел :(
Рейтинг:4
флаг hr

Подсчитать все каталоги в том числе скрытые в дереве с корнем в текущем каталоге . либо

найти . -тип d -printf '\n' | туалет -л

или же

найти . -тип d -printf x | туалет -с

(вы можете заменить любой символ вместо Икс: если вы выбираете специальный символ оболочки, обязательно заключайте его в кавычки или экранируйте). С использованием напечатать '\n' | туалет -л или же печать х | туалет -с вместо передачи списка имен файлов в туалет -л обеспечит правильность подсчета, даже если есть каталоги, имена которых содержать новые строки.

Обе команды включают начальный каталог . в счет - если хотите строго считать субкаталоги, затем либо вычтите 1, либо добавьте -глубина 1

найти . -mindepth 1 -type d -printf '\n' | туалет -л

или использовать ! -имя . исключить . каталог явно.

Если вы хотите исключить скрытые каталоги (включая возможные не-скрытые подкаталоги скрытых), то чернослив их экс.

find -mindepth 1 -type d \( -name '.*' -prune -o -printf x \) | туалет -с

В качестве альтернативы, используя рекурсивную подстановку оболочки для обхода дерева. Например, используя zsh

каталоги=(**/(НД/))
напечатать $#диров

куда (НД/) находятся квалификаторы глобуса это делает **/ сопоставлять только каталоги и включать скрытые ("Дot") - опускаем Д если вы хотите подсчитывать только нескрытые каталоги.

Вы можете сделать что-то подобное в bash:

shopt -s nullglob dotglob globstar
установить -f -- **/
printf '%d\n' "$#"

однако в отличие от zsh / квалификатор, **/ Шаблон glob соответствует всему, что выглядит как каталог, включая символические ссылки на каталоги.

флаг in
Большое спасибо за ваш ответ
флаг hr
@bac0n спасибо - добавлено (и обновлены другие части с -mindepth для согласованности)
Рейтинг:1
флаг cn

Попробуйте запустить лс-л-р | грэп -с ^ д в вашем терминале из каталога, в котором вы хотите знать, сколько внутри.

*** редактировать *** Используйте приведенное ниже, чтобы сканировать с переменным путем, предложенным пользователю.

#!/бин/баш
echo "Введите путь для сканирования:"
путь чтения
ls -l -R $путь | грэп -с ^ д
флаг in
Это именно то, что я ищу
флаг in
Но как я могу установить собственный путь к папке?
Roxana avatar
флаг cn
Вы можете добавить путь командой вроде такой: ls -l -R /usr/share/themes | грэп -с ^ д ```. Вы можете добавить переменную типа ```ls -l -R $path | grep -c ^d``` и укажите $path в качестве входной переменной для вашего скрипта.
флаг in
Спасибо большое
sourav c. avatar
флаг cn
В общем, разбор вывода `ls` - плохая идея. Я бы никого не поощрял. См. вместо этого https://unix.stackexchange.com/questions/128985/why-not-parse-ls-and-what-to-do.
Roxana avatar
флаг cn
Я отредактировал свой ответ выше, чтобы показать переменную. Сурав не ошибается, избегая разбора LS, но поскольку вы НЕ ищете имена файлов, а считаете папки, это не имеет значения. это простое и чистое решение.
bac0n avatar
флаг cn
@Roxanna Это по-прежнему будет представлять проблему, полагайте, что неинтерактивный режим использует литерал в качестве стиля цитирования, что будет означать, например, `'folder'$'\n''d'` даст ложное срабатывание, думаю, что любое подойдет другой *стиль цитирования*.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.