Подсчет количества каталогов в определенном каталоге
Как подсчитать количество папок в определенном каталоге. Я использую следующую команду, но она всегда обеспечивает дополнительную.
find /directory/ -maxdepth 1 -type d -print| wc -l
Например, если у меня есть 3 папки, эта команда обеспечивает 4. Если она содержит 5 папок, команда предоставляет 6. Почему это?
Ответы
Ответ 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, потому что в подсчете есть две дополнительные жесткие ссылки:
- папка собственная самореферентная./запись, и
- папка родительская ссылка на папку
Ответ 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
Это дает вам идеальный счет.