Задача: Выводом при запуске файла будет количество подкаталогов (считая все подкаталоги в дереве) в введенной директории.
Я знаю, как рекурсировать каталог с помощью -r
, но как я могу подсчитать все эти числа в файле сценария оболочки?
Попробуйте запустить ls -l -R | grep -c ^ d
в вашем терминале из каталога, в котором вы хотите знать, сколько их находится внутри.
*** edit *** Используйте нижеприведенное для сканирования с изменяемым путем, предложенным пользователю.
#!/bin/bash
echo "Please enter path to scan:"
read path
ls -l -R $path | grep -c ^d
Для подсчета всех каталогов , включая скрытые в дереве с корнем в текущем каталоге .
либо
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 ** /
соответствует всему, что выглядит как каталог, включая символические ссылки на каталоги.