Я могу определить количество подкаталогов в каталоге с помощью 'ls-l'?

Linux первоначально загружается с электронным диском (названный initrd, для "НАЧАЛЬНОГО RamDisk") как /. Этот диск имеет как раз достаточно на нем, чтобы смочь найти реальный корневой раздел (включая любой драйвер и модули файловой системы требуемым). Это монтирует корневой раздел на временную точку монтирования на initrd, затем вызывает pivot_root(8) подкачивать корневые и временные точки монтирования, уезжая initrd имея возможность быть umountредактор и фактическая корневая файловая система на /.

8
16.09.2011, 10:49
5 ответов

Это обычно верно в системах 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 опция).

7
27.01.2020, 20:11

Вот еще один способ считать подкаталоги (нерекурсивно) в Bash:

(
shopt -s nullglob dotglob
printf '%s\000' */ | tr -dc '\0' | wc -c  # wc counts null bytes
)

Поскольку каждое имя файла завершается символом ASCII NUL, это должно работать правильно, даже если имя файла содержит символ новой строки.

2
27.01.2020, 20:11

Вы могли попробовать:

ls -l |grep ^d | wc -l
2
27.01.2020, 20:11

Я ничего не могу найти в документации, которая подтверждает, что количество ссылок всегда будет +2 на количестве подкаталогов.

Но, для нахождения корректной суммы используйте:

find . -type d -mindepth 1  -maxdepth 1 | wc -l

Или если необходимо использовать ls -l, см. другой ответ.

1
27.01.2020, 20:11
  • 1
    , я думаю, что Вы имели в виду -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 (дерево каталогов сокращено прежде, чем проверить на каталоги, сэкономить время).

0
27.01.2020, 20:11

Теги

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