В 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
).