В Unix-системах обычно верно, что количество ссылок на каталог равно количеству подкаталогов плюс 2. Однако в некоторых случаях это не так:
Некоторые юниты допускают жесткие ссылки на каталоги. Тогда будет более 2 ссылок, которые не соответствуют подкаталогам.
Существуют файловые системы, в которых в каталогах нет записей для .
и ..
. GNU найти руководство упоминает некоторые примеры в обсуждении его -noleaf
вариант (который отключает оптимизацию , которая предполагает , что .
и ..
существуют во всех каталогах): «CD-ROM или MS-DOS файловых систем или объем AFS точки монтирования»
Почти надежный способ подсчета количества подкаталогов (он может все еще не работать, если имя файла содержит символ новой строки)
$(($(LC_ALL=C ls -la /path/to/directory | grep '^d' | wc -l) - 2)
Более надежный способ использует оболочки */
и оболочки .*/
; как обычно, обработка случая, когда шаблон не совпадает, представляет собой небольшую боль (за исключением bash и zsh, где вы можете включить nullglob
опцию).
Жиль "ТАК - перестань быть злым"
источник
-type d
, но: 1. это требует GNU find; 2. вам нужно вычесть 1 для начального каталога (или прохода-mindepth 1
).Не используйте
ls
для этого . Вот один способ, который работает со всеми именами файлов, даже с теми, которые содержат символы новой строки, потому что он печатает только символ новой строки вместо имени файла:Редактировать: текущая версия не приводит к каким-либо предупреждениям, потому что
-mindepth
и-maxdepth
должно быть раньше-type
(дерево каталогов сокращается перед проверкой каталогов, чтобы сэкономить время).источник