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

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

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

-4
задан 28 August 2021 в 03:22

2 ответа

Попробуйте запустить ls -l -R | grep -c ^ d в вашем терминале из каталога, в котором вы хотите знать, сколько их находится внутри.

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

#!/bin/bash
echo "Please enter path to scan:"
read path
ls -l -R $path | grep -c ^d
1
ответ дан 4 September 2021 в 09:27

Для подсчета всех каталогов , включая скрытые в дереве с корнем в текущем каталоге . либо

find . -type d -printf '\n' | wc -l

, либо

find . -type d -printf x | wc -c

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

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

find . -mindepth 1 -type d -printf '\n' | wc -l

, либо используйте ! -имя . , чтобы исключить . каталог явно.

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

find -mindepth 1 -type d \( -name '.*' -prune -o -printf x \) | wc -c

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

dirs=( **/(ND/) )
print $#dirs

, где (ND /) - это квалификаторы glob , которые заставляют ** / соответствовать только каталогам и включать скрытые (" D ot ") ones - опустите D , если вы хотите подсчитывать только нескрытые каталоги.

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

shopt -s nullglob dotglob globstar
set -f -- **/
printf '%d\n' "$#"

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

4
ответ дан 4 September 2021 в 09:27

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

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