Подтвердить что ты не робот

Подсчет количества каталогов в определенном каталоге

Как подсчитать количество папок в определенном каталоге. Я использую следующую команду, но она всегда обеспечивает дополнительную.

find /directory/ -maxdepth 1 -type d -print| wc -l

Например, если у меня есть 3 папки, эта команда обеспечивает 4. Если она содержит 5 папок, команда предоставляет 6. Почему это?

4b9b3361

Ответ 1

find также печатает сам каталог:

$ find .vim/ -maxdepth 1 -type d
.vim/
.vim/indent
.vim/colors
.vim/doc
.vim/after
.vim/autoload
.vim/compiler
.vim/plugin
.vim/syntax
.vim/ftplugin
.vim/bundle
.vim/ftdetect

Вместо этого вы можете протестировать дочерние элементы каталога и вообще не спускаться в них:

$ find .vim/* -maxdepth 0 -type d
.vim/after
.vim/autoload
.vim/bundle
.vim/colors
.vim/compiler
.vim/doc
.vim/ftdetect
.vim/ftplugin
.vim/indent
.vim/plugin
.vim/syntax

$ find .vim/* -maxdepth 0 -type d | wc -l
11
$ find .vim/ -maxdepth 1 -type d | wc -l
12

Вы также можете использовать ls:

$ ls -l .vim | grep -c ^d
11


$ ls -l .vim
total 52
drwxrwxr-x  3 anossovp anossovp 4096 Aug 29  2012 after
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 autoload
drwxrwxr-x 13 anossovp anossovp 4096 Aug 29  2012 bundle
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 colors
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 compiler
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 doc
-rw-rw-r--  1 anossovp anossovp   48 Aug 29  2012 filetype.vim
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftdetect
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftplugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 indent
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 plugin
-rw-rw-r--  1 anossovp anossovp 2505 Aug 29  2012 README.rst
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 syntax

$ ls -l .vim | grep ^d
drwxrwxr-x  3 anossovp anossovp 4096 Aug 29  2012 after
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 autoload
drwxrwxr-x 13 anossovp anossovp 4096 Aug 29  2012 bundle
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 colors
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 compiler
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 doc
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftdetect
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftplugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 indent
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 plugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 syntax

Ответ 2

Получить количество только каталогов в текущем каталоге

echo */ | wc

вы выберете как 1 309 4594

2nd digit не представляет. каталогов.

или

tree -L 1 | tail -1

Ответ 3

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

Для find -mindepth означает общее число, возвращаемое в каталогах

-maxdepth означает общее число, возвращаемое в каталогах

-type d означает каталог

И для wc -l означает подсчет строк ввода

Ответ 4

Лучший способ перехода на ваш диск и просто выполнить

ls -lR | grep ^d | wc -l

и найти все папки в общей сложности, включая подкаталоги?

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

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

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

Ура!

Ответ 5

Запустите stat -c %h folder и stat -c %h folder 2 из результата. При этом используется только один подпроцесс, в отличие от 2 (или даже 3), требуемого большинством других решений здесь (обычно find плюс wc).

Использование sh/bash:

cnt = $ (('stat -c% h папка' - 2))
echo $ cnt # 'echo' - встроенная функция sh/bash, а не дополнительный процесс

Использование csh/tcsh:

@cnt = 'stat -c% h folder' - 2
echo $ cnt # 'echo' является встроенной функцией csh/tcsh, а не дополнительным процессом


Объяснение: stat -c %h folder печатает количество жестких ссылок на папку, и каждая подпапка в папке содержит запись.. /, которая является жесткой ссылкой на папку. Вы должны вычесть 2, потому что в подсчете есть две дополнительные жесткие ссылки:

  1. папка собственная самореферентная./запись, и
  2. папка родительская ссылка на папку

Ответ 6

Я думаю, что самый легкий

  ls -ld images/* | wc -l

где images - ваш целевой каталог. Флаг -d ограничивает каталоги, а флаг -l будет выполнять листинг в строке, совместимый с очень знакомым wc -l для количества строк.

Ответ 7

Если у вас есть только каталоги в папке и нет файлов, это делает это:

ls | wc -l

Ответ 8

Чистое решение bash:

shopt -s nullglob
dirs=( /path/to/directory/*/ )
echo "There are ${#dirs[@]} (non-hidden) directories"

Если вы также хотите подсчитать скрытые каталоги:

shopt -s nullglob dotglob
dirs=( /path/to/directory/*/ )
echo "There are ${#dirs[@]} directories (including hidden ones)"

Обратите внимание, что это также будет считать ссылки на каталоги. Если вы этого не хотите, это немного сложнее с этим методом.


Использование find:

find /path/to/directory -type d \! -name . -prune -exec printf x \; | wc -c

Трюк заключается в выводе x в stdout каждый раз, когда найден каталог, а затем используйте wc для подсчета количества символов. Это будет подсчитывать количество всех каталогов (включая скрытые), исключая ссылки.


Представленные здесь методы безопасны для смешных символов, которые могут отображаться в именах файлов (пробелы, символы новой строки, символы глобуса и т.д.).

Ответ 9

Несколько полезных примеров:

считать файлы в текущем каталоге

/bin/ls -lA  | egrep -c '^-'

считать dirs в текущем dir

/bin/ls -lA  | egrep -c '^d'

считать файлы и каталоги в текущем каталоге

/bin/ls -lA  | egrep -c '^-|^d'

считать файлы и директории в одном подкаталоге

/bin/ls -lA  subdir_name/ | egrep -c '^-|^d'

Я заметил странную вещь (по крайней мере, в моем случае):

Когда я пробовал использовать ls вместо /bin/ls параметр -A do not list implied. and.. -A do not list implied. and.. do not list implied. and.. НЕ РАБОТАЕТ, как ожидается. Когда я использую ls которые показывают./и../Так что результат неправильный. РЕШЕНИЕ: /bin/ls вместо ls

Ответ 10

Использование zsh:

a=(*(/N)); echo ${#a}

N - это nullglob, / делает его совпадающим с каталогами, # counts. Он будет аккуратно справляться с пробелами в именах каталогов, а также возвращать 0, если каталогов нет.

Ответ 11

Подсчитайте все файлы и подпапки, стиль windows:

dir=/YOUR/PATH;f=$(find $dir -type f | wc -l); d=$(find $dir -mindepth 1 -type d | wc -l); echo "$f Files, $d Folders"

Ответ 12

Если вы хотите использовать регулярные выражения, попробуйте:

ls -c | grep "^d" | wc -l

Ответ 13

Лучший способ сделать это:

ls -la | grep -v total | wc -l

Это дает вам идеальный счет.