Linux первоначально загружается с электронным диском (названный initrd
, для "НАЧАЛЬНОГО RamDisk") как /
. Этот диск имеет как раз достаточно на нем, чтобы смочь найти реальный корневой раздел (включая любой драйвер и модули файловой системы требуемым). Это монтирует корневой раздел на временную точку монтирования на initrd
, затем вызывает pivot_root(8)
подкачивать корневые и временные точки монтирования, уезжая initrd
имея возможность быть umount
редактор и фактическая корневая файловая система на /
.
Это обычно верно в системах Unix, что количество ссылок на каталог является количеством подкаталогов плюс 2. Однако существуют случаи, где это не верно:
Некоторые нельды позволяют жесткие ссылки на каталоги. Затем будет больше чем 2 ссылки, которые не соответствуют подкаталогам.
Существуют файловые системы, где каталоги не имеют записей для .
и ..
. GNU находит, что руководство упоминает некоторые примеры в обсуждении -noleaf
опция (который отключает оптимизацию, которая принимает это .
и ..
существуйте во всех каталогах): “CD-ROM или файловые системы MS-DOS или точки монтирования тома AFS”
Почти надежный способ считать количество подкаталогов (это может все еще перестать работать, если имя файла содержит символ новой строки)
$(($(LC_ALL=C ls -la /path/to/directory | grep '^d' | wc -l) - 2)
Более надежный путь использует шарики оболочки */
и .*/
; поскольку обычная обработка случая, где шаблон не соответствует, является чем-то вроде боли (кроме удара и zsh, где можно включить nullglob
опция).
Вот еще один способ считать подкаталоги (нерекурсивно) в Bash:
(
shopt -s nullglob dotglob
printf '%s\000' */ | tr -dc '\0' | wc -c # wc counts null bytes
)
Поскольку каждое имя файла завершается символом ASCII NUL, это должно работать правильно, даже если имя файла содержит символ новой строки.
Я ничего не могу найти в документации, которая подтверждает, что количество ссылок всегда будет +2 на количестве подкаталогов.
Но, для нахождения корректной суммы используйте:
find . -type d -mindepth 1 -maxdepth 1 | wc -l
Или если необходимо использовать ls -l
, см. другой ответ.
-type d
, но: 1. это требует, чтобы GNU нашел; 2. необходимо вычесть 1 для начального каталога (или передача -mindepth 1
).
– Gilles 'SO- stop being evil'
04.10.2010, 23:11
Не использовать ls
для этого. Вот один путь, который работает со всеми именами файлов, даже те, которые содержат новые строки, потому что он печатает только символ новой строки вместо имени файла:
find . -mindepth 1 -maxdepth 1 -type d -printf '\n' | wc -l
Править: Текущая версия не приводит ни к каким предупреждениям, потому что -mindepth
и -maxdepth
должен быть прежде -type
(дерево каталогов сокращено прежде, чем проверить на каталоги, сэкономить время).