计算特定目录中的目录数

时间:2013-07-15 06:33:53

标签: linux bash

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

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

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

16 个答案:

答案 0 :(得分:74)

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

答案 1 :(得分:49)

仅计算当前目录中的目录

echo */ | wc

你会像1 309 4594

那样退出

2nd digit代表没有。目录。

tree -L 1 | tail -1

答案 2 :(得分:12)

导航到您的驱动器并执行

的最佳方式
ls -lR | grep ^d | wc -l

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

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

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

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

干杯!

答案 3 :(得分:9)

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

使用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. 文件夹自己的自我引用./ entry和
  2. 文件夹的父级链接文件夹

答案 4 :(得分:9)

我认为最简单的是

  ls -ld images/* | wc -l

其中images是您的目标目录。 -d标志限制目录,-l标志将执行每行列表,与非常熟悉的行wc -l兼容。

答案 5 :(得分:6)

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

ls | wc -l

答案 6 :(得分: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

诀窍是每次找到目录时都向{stdout}输出x,然后使用wc来计算字符数。这将计算所有目录(包括隐藏目录)的数量,不包括链接。

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

答案 7 :(得分:3)

一些有用的例子:

计算当前目录中的文件

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

在当前目录中计算dirs

/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 ..无法正常工作。我用的时候   显示./和../的ls因此导致错误计数。解决方案:/bin/ls代替ls

答案 8 :(得分:2)

使用zsh

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

N是nullglob,/使其匹配目录,#计数。它将整齐地处理目录名中的空格,如果没有目录则返回0

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

获取目录数量 - 导航 进入目录并执行

 ls -l | grep -c ^d

答案 11 :(得分: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"

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

您想要的最好的答案是

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

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

如果您要递归计算子文件夹,则不要使用maxdepth选项,所以

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

答案 14 :(得分:0)

如果您想计算具有相似名称的文件夹,例如文件夹 01、文件夹 02、文件夹 03 等,那么您可以执行

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

答案 15 :(得分:-1)

最佳方式:

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

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