130

如何计算特定目录中的文件夹数。我正在使用以下命令,但它总是提供一个额外的命令。

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

例如,如果我有 3 个文件夹,则此命令提供 4。如果它包含 5 个文件夹,则该命令提供 6。这是为什么呢?

4

17 回答 17

113

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
于 2013-07-15T06:41:52.203 回答
83

仅获取当前目录中的目录计数

echo */ | wc

你会像1 309 4594

2nd digit代表没有。的目录。

或者

tree -L 1 | tail -1

于 2014-04-09T08:44:02.570 回答
36
find . -mindepth 1 -maxdepth 1 -type d | wc -l

对于查找-mindepth意味着目录中重复的总数

-maxdepth表示目录中重复的总数

-type d表示目录

而对于wc -l意味着计算输入的行数

于 2015-12-20T21:43:26.207 回答
23

如果文件夹中只有目录而没有文件,则这样做:

ls | wc -l
于 2019-01-20T09:54:26.240 回答
13

导航到您的驱动器并简单地执行的最佳方式

ls -lR | grep ^d | wc -l

并总共查找所有文件夹,包括子目录?

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

...或查找根目录中的所有文件夹(不包括子目录)?

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

干杯!

于 2014-04-30T14:02:33.020 回答
13

运行stat -c %h folder并从结果中减去 2。find与这里的大多数其他解决方案(通常是plus )所需的 2 个(甚至 3 个)不同,这仅使用一个子进程wc

使用 sh/bash:

cnt=$((`stat -c %h folder` - 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. folder自己的自引用 ./ 条目,以及
  2. folder的父文件夹的链接
于 2016-07-26T00:41:46.680 回答
8

我们可以使用以下命令找到的目录

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

于 2019-12-02T09:51:35.990 回答
8

我认为最简单的是

  ls -ld images/* | wc -l

images你的目标目录在哪里。-d 标志限制为目录,-l 标志将执行每行列表,与非常熟悉wc -l的行数兼容。

于 2016-08-07T23:20:16.090 回答
5

一些有用的例子:

计算当前目录中的文件

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

计算当前目录中的目录

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

计算当前目录中的文件和目录

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

计算一个子目录中的文件和目录

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

我注意到一件奇怪的事情(至少在我的情况下):

当我尝试ls改用参数NOT WORK 时/bin/ls 。当我使用 该节目时 ./ 和 ../ 所以结果错误计数。解决方案:改为-Ado not list implied . and ..ls/bin/lsls

于 2018-03-07T17:23:35.383 回答
4

要获取目录的数量 - 导航到目录并执行

 ls -l | grep -c ^d
于 2021-07-09T08:36:27.530 回答
3

使用zsh

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

N是一个nullglob,/使其匹配目录,#计数。0如果没有目录,它将巧妙地处理目录名称中的空格以及返回。

于 2016-11-14T22:18:40.923 回答
3

一个纯粹的 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每次找到目录时输出到标准输出,然后用于wc计算字符数。这将计算所有目录(包括隐藏目录)的数量,不包括链接。


这里介绍的方法对于可能出现在文件名中的有趣字符(空格、换行符、全局字符等)都是安全的。

于 2016-05-27T11:02:34.840 回答
1

你想要的最好的答案是

echo `find . -maxdepth 1 -type d | wc -l`-1 | bc

这减去一个以删除不需要的“。” 查找列表的目录(如上面提到的patel deven)。

如果你想递归地计算子文件夹,那么就不要使用 maxdepth 选项,所以

echo `find . -type d | wc -l`-1 | bc

PS 如果您发现命令替换很难看,可以使用sed和作为纯流进行减法bc

从计数中减一:

find . -maxdepth 1 -type d | wc -l | sed 's/$/-1\n/' | bc

或者,将计数加到减一:

find . -maxdepth 1 -type d | wc -l | sed 's/^/-1+/' | bc
于 2020-01-29T11:59:11.560 回答
0

如果您想计算具有相似名称的文件夹,例如 folder01、folder02、folder03 等,那么您可以这样做

ls -l | grep ^d | grep -c 文件夹

于 2021-08-04T16:17:02.637 回答
0

如果要使用正则表达式,请尝试:

ls -c | grep "^d" | wc -l
于 2019-05-19T22:26:21.800 回答
0

统计所有文件和子文件夹,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"
于 2017-11-17T18:11:55.923 回答
-2

最好的方法:

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

这为您提供了完美的计数。

于 2016-09-15T11:16:25.747 回答