计算特定目录中的目录数


103

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

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

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


4
由于当前目录“。”,因此存在额外的1个计数。,“查找”也将其考虑在内。
patel deven,

Answers:


94

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

真好!您将如何$ ls -l .vim使用PHP 做到这一点?或如何只获取总数,而没有列表。我的意思是,在这种情况下只能得到52
Pathros

哈哈 我喜欢反对PowerShell的说法是BASH在各个方面都更容易...想看看POSH命令来做到这一点吗?(ls).Count
Kolob Canyon

@Pathros将glob与标志GLOB_ONLYDIR 一起使用,并对结果进行count()。
Pilipe '18年

1
ls -l | grep -c ^d很简单,很有效。@Pathros在PHP中可能是更好的方法,但是在PHP中,最坏的情况是您始终可以使用shell_exec()函数执行命令行并将结果返回到字符串。即 $dirCount = shell_exec('ls -l | grep -c ^d');
gigabyte

66

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

echo */ | wc

你会把像 1 309 4594

2nd digit代表不。目录。

要么

tree -L 1 | tail -1


8
不幸的是,如果目录名中有空格,则此操作将失败。
Michael Campbell

zsh: no matches found: */需要nullglob
Anne van Rossum

@AnnevanRossum你有吗echo。类型which echo
EmptyData '16

7
第一个可以进一步改进:echo */ | wc -w
ibic

注意,如果没有目录而不是0,它将计数为
1。– jinawee

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

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

-maxdepth 表示目录中可恢复的总数

-type d 指目录

对于wc -l均值,计算输入的行数


2
你能解释一下你的答案吗(在你的答案里面)?
Zulu

-mindepth表示目录中可恢复的总数,-maxdepth表示目录中可恢复的总数,-type d表示目录,而wc -l表示给定目录列表中的行数
shiyani suresh

find . -mindepth 1 -maxdepth 1 -type d | wc -l会在数字之间给您很多空格,例如:` dir_count=`find . -maxdepth 1 -type d | wc -l | xargs`; echo $dir_count # will print just 2 if (( $dir_count > 1 )); then echo "Yaa"; fi # will print "Yaa"
2`

16

如果文件夹中仅包含目录,而没有文件,则执行以下操作:

ls | wc -l

2
这也得到文件,但是问题是关于文件夹/目录。
罗伯特

12

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

ls -lR | grep ^d | wc -l

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

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

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

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

干杯!


请注意,前面的ls -lR在对点前缀目录进行find -type d 计数时会忽略它们,因此如果您具有点前缀目录(例如,您有.git子目录!),则第一个命令给出的计数是错误的。您不能简单地使用, -lRa因为您还会获得每个目录...条目。它也适用于@Pavel Anossov的答案
marcz

12

运行stat -c %h folder并从结果中减去2。与此处大多数其他解决方案(通常为findplus wc)所需的2(或什至3)相反,此方法仅使用一个子过程。

使用sh / bash:

cnt = $(((stat -c%h folder`-2))
echo $ cnt#'echo'是一个sh / bash内置函数,不是一个额外的过程

使用csh / tcsh:

@ cnt =`stat -c%h文件夹`-2
echo $ cnt#'echo'是内置的csh / tcsh,不是一个额外的过程


说明:stat -c %h folder打印到文件夹的硬链接数,并且文件夹下的每个子文件夹都包含一个../条目,该条目是回到文件夹的硬链接。您必须减去2,因为计数中还有两个附加的硬链接:

  1. 文件夹本身的自引用./条目,以及
  2. 文件夹的父级到文件夹的链接

与此问题相关:[为什么在向目录添加任何内容之前,新目录的硬链接数为2?](unix.stackexchange.com/questions/101515)它解释了为什么这是一个很好的答案。不幸的是,这没有引起足够的重视!尽管这是一个很好的答案,但是不幸的是,它的结果取决于文件系统,但是对于大多数常见的文件系统,这是可行的。
kvantour

8

我认为最简单的是

  ls -ld images/* | wc -l

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


同时返回结果+1
josef

1
根据man ls-d做:“列出目录本身,而不是目录内容”,也就是说,如果运行ls /tmp,您将得到其中的内容/tmp,而如果运行,您将ls -d /tmp得到/tmp。该-d开关不过滤的目录,如被要求提供。
罗伯特

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,而不是/bin/ls-A参数do not list implied . and ..无法正常工作espected。当我使用 lsshow ./和../时,导致计数错误。解决方案:/bin/ls代替ls


4

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

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


只要ls -l | grep ^d | wc -l做,就不需要在"这里使用
kaspiotr,

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


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


这是此问题中提出的最佳解决方案,它将始终有效!
kvantour


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"

0

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

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

1
您想在纯代码答案中添加一些解释吗?这将有助于消除人们对StackOverflow是一种免费代码编写服务的误解。另外,请查看此处以改善外观:stackoverflow.com/editing-help
Yunnosch

0

想要的最好的答案是

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

-1

最好的方法:

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

这给您一个完美的计数。


6
您的意思是那是最糟糕的方式!此外,这不计算目录数。如果目录名称包含字符串total怎么办?你的方法坏了:(不要解析ls
gniourf_gniourf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.