Как подсчитать количество папок на диске с помощью Linux?


24

Мне нужно организовать внешний жесткий диск таким образом, чтобы на нем было не более 500 папок. На панели «Свойства» в Ubuntu отображается только количество файлов, а не количество папок.

Есть ли простая командная строка, которая скажет мне количество подкаталогов?

Мне нужно посчитать рекурсивно, и диск является внешним HDD, установленным на /media/MUSIC/. Это для автомобильной стереосистемы, чья документация гласит, что она читает только первые 500 папок.

Ответы:


20

Перейдите к своему диску и просто выполните

ls -lR | grep ^d | wc -l

Похоже, это дает более правильное число, чем ответ, который я принял 3 года назад. Он считал каталог, в котором я находился, тогда как этого не было.
Дин Скорее

Я также вижу разные цифры, но не слишком разные.
СПРБР

Лично я предпочитаю grep -cболее чем wc -l. Может быть, это только я.
Maxim_united

1
Выше будет пересчитать, если любая запись каталога содержит последовательность \nd(где \nсимвол NL).
Тоби Спейт

1
Тоби прав, lsвывод не должен быть передан по трубопроводу . Более того, это будет намного медленнее, потому что оно должно вывести все дерево, а затем запустить через него grep
phuclv

37

Найти все папки в целом, включая подкаталоги?

find /mount/point -type d | wc -l

... или найти все папки в корневом каталоге (не включая подкаталоги)?

find /mount/point -maxdepth 1 -type d | wc -l

Это первый именно то, что я после. Благодарность!
Дин Скорее

@Dean: да, я тоже использовал его для подсчета каталогов в моей музыкальной коллекции. :) чтобы похвастаться правами, посчитайте ваши MP3: find / mount / point -type f | grep -i mp3 | wc -l
шарлатан-кихот

1
@Dean: да, я не знаю синтаксис поиска , но я обычно использовал бы grep -v для этого: find / mount / pt -type f | grep -vi mp3 | grep -vi wav | wc -l ... (и <i> </ i> не работает в комментариях, используйте *foo*для курсива: foo )
квик-кряк

2
@Dean: я думаю, что вы просто использовали бы find /path -not -iname '*.mp3' | wc -lдля фильтрации MP3, или чтобы использовать как MP3, так и WAVfind /path -not -iname '*.mp3' -not -iname '*.wav' | wc -l
Quack Quixote

1
Нужно было добавить -type f, чтобы он также игнорировал папки, но поздравляю! Я только что нашел целую кучу файлов m4a, о которых понятия не имел ... Спасибо!
Дин Скорее

4

Новые строки являются действительными символами в именах каталогов. Я предлагаю findнапечатать пустую строку для каждого найденного каталога, а затем wcподсчитать эти строки.

find /mount/point -type d -printf '\n' | wc -l

3

Попробуйте следующее [см. Ниже]:

ls -1 -p | grep "/" | wc -l

Это распечатает список из одного каталога текущего каталога с косыми чертами для элементов, которые являются подкаталогами, а затем подсчитает строки с косыми чертами.

РЕДАКТИРОВАТЬ: вы, вероятно, должны пойти с ответом Quack Quixote, поскольку он немного более явный, но я исправил мой (после учета предложений кряк).

ls -Rp | grep "/$" | wc -l

Нужно добавить -R, чтобы идти рекурсивно (извините, что не упомянул), и нужно указать путь к ls, но да, это работает: ls -1 -p -R / media / MUSIC / | grep "/" | wc -l Спасибо!
Дин Скорее

Попробовав и это, и предложение шарлатанового кихота, я получил 2 разных результата ... Я склонен верить другому. Спасибо, в любом случае!
Дин Скорее

1
вам не нужно, -1поскольку ls обнаружит канал и не будет форматировать столбцы. также вы можете получить рекурсивные списки -R, но тогда вы, вероятно, захотите использовать grep для "/$"совпадения только с конечными слешами (иначе счетчик будет выключен). окончательная версия:ls -Rp | grep "/$" | wc -l
Квик-кихот

1
находка версия я разместил подсчитает .(то есть /mount/point) в счете, в LS версию в моем выше комментарии не будет. эти значения различаются на 1, но вы можете использовать их /mount/point/*в команде find для исправления этого (при условии отсутствия скрытых каталогов точек).
шарлатан-кихот

Я не уверен, почему вы получили два разных результата, но метод @ quack будет включать в себя «скрытые» каталоги (то есть те, которые начинаются с «.»).
каскадёр

1

Я написал ffcnt для ускорения рекурсивного подсчета файлов при определенных обстоятельствах: ротационные диски и файловые системы, которые поддерживают отображение экстентов .

Это может быть на порядок быстрее, чем lsили findоснованные подходы


1

Когда имеется большое количество каталогов, такие инструменты, как подобные, treeмогут занять вечность или даже зависнуть, поэтому вы можете захотеть использовать что-то более эффективное.

Наиболее эффективный способ подсчета каталогов, о которых я могу подумать, заключается в следующем, поскольку для каждой найденной папки findбудет напечатан только один .каталог, а не полный путь и имя файла, и wcпотребуется только итерировать по количеству символов:

find /mount/point -type d -printf '.' |wc -c

Чтобы исключить /mount/pointсебя из расчета и только подсчитать подкаталоги:

find /mount/point -mindepth 1 -type d -printf '.' |wc -c

1

Я нашел du --inodesполезным, но я не уверен, какая версия duэтого требует. На Ubuntu 17.10 работает следующее:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

Объединить с | sort -nrсортировать по убыванию по количеству содержащихся inode.


0

Мне нравится использовать дерево, чтобы получить количество каталогов с

tree -d -R -fi --noreport | wc -l

Или неправильное использование находки, чтобы показать, что большая часть папок находится с

find . -type d -printf "%h\n" | cut -d/ -f-2 | sort | uniq -c | sort -rn

Или что-то вроде: дерево | grep -e '^. * directoryies'
mindcrime

-2

Найти количество папок и каталог в текущем каталоге

Введите следующую команду в своем терминале

echo */ | wc
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.