计算特定目录中的目录数

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

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

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

281936 次浏览

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

只计算工作目录中的目录

echo */ | wc

你会像 1 309 4594一样出局

2nd digit表示目录的数量。

或者

tree -L 1 | tail -1

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

ls -lR | grep ^d | wc -l

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

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

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

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

干杯!

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

对于 find -mindepth,表示目录中的总数递归

-maxdepth表示目录中的累加总数

-type d表示目录

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

纯 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计算字符数。这将计算所有目录(包括隐藏目录)的数量,不包括链接。


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

运行 stat -c %h folder并从结果中减去2。这里只使用一个子流程,而大多数其他解决方案(通常是 findlswc)需要2个(甚至3个)子流程。

使用 sh/bash:

Echo $((‘ stat-c% h file‘-2)) # ‘ echo’是 shell 内置的

使用 csh/tcsh:

@ cnt = ‘ stat-c% h file’-2; echo $cnt # ‘ echo’是 shell 内置的


说明 : stat -c %h folder打印到 文件夹的硬链接数,文件夹下的每个子文件夹包含一个。./条目,这是一个硬链接回到 文件夹。必须减去2,因为在计数中有两个额外的硬链接:

  1. 文件夹 自己的自引用./条目,以及
  2. 文件夹 的父文件夹链接到 < em > 文件夹

我觉得最简单的是

  ls -ld images/* | wc -l

其中 images是您的目标目录。D 标志限制在目录中,-l 标志将执行每行清单,与非常熟悉的用于行计数的 wc -l兼容。

最好的方法是:

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

这样你就可以完美地计数了。

使用 zsh:

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

N是一个空球,/使它匹配目录,#计数。它将巧妙地处理目录名中的空格,并在没有目录时返回 0

统计所有文件和子文件夹,窗口样式:

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

一些有用的例子:

当前目录中的计数文件

/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代替 /bin/ls -A参数 do not list implied . and ..不能正常工作。当我使用 显示./和. ./所以结果计数错误。解决方案: 用 /bin/ls代替 ls

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

ls | wc -l

如果你想使用正则表达式,那么试试:

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

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

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

你想要什么的最佳答案是

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

这样减去一个目录来删除不需要的“ .”目录来查找列表(正如上面提到的帕特尔德文)。

如果要递归地计算子文件夹的数量,那么只需停用 maxdeep 选项,因此

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

PS 如果你觉得指令替代难看,可以使用 sedbc作为一个纯流来减去一个。

从计数中减一:

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

或者,将计数加到负一:

find . -maxdepth 1 -type d | wc -l | sed 's/^/-1+/' | bc

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

 ls -l | grep -c ^d

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

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