如何计算特定目录中的文件夹数。我使用以下命令,但它总是提供一个额外的命令。
find /directory/ -maxdepth 1 -type d -print| wc -l
例如,如果我有3个文件夹,这个命令提供4个。如果它包含5个文件夹,则该命令提供6个。为什么?
find也正在打印目录本身:
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
$ 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一样出局
1 309 4594
2nd digit表示目录的数量。
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,表示目录中的总数递归
-mindepth
-maxdepth表示目录中的累加总数
-maxdepth
-type d表示目录
-type d
对于 wc -l,意味着计算输入的行数
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计算字符数。这将计算所有目录(包括隐藏目录)的数量,不包括链接。
x
wc
这里提供的方法都是对可以出现在文件名(空格、换行符、全局字符等)中的有趣字符的安全的 wrt。
运行 stat -c %h folder并从结果中减去2。这里只使用一个子流程,而大多数其他解决方案(通常是 find或 ls加 wc)需要2个(甚至3个)子流程。
stat -c %h folder
使用 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,因为在计数中有两个额外的硬链接:
我觉得最简单的是
ls -ld images/* | wc -l
其中 images是您的目标目录。D 标志限制在目录中,-l 标志将执行每行清单,与非常熟悉的用于行计数的 wc -l兼容。
images
最好的方法是:
ls -la | grep -v total | wc -l
这样你就可以完美地计数了。
使用 zsh:
zsh
a=(*(/N)); echo ${#a}
N是一个空球,/使它匹配目录,#计数。它将巧妙地处理目录名中的空格,并在没有目录时返回 0。
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
/bin/ls
-A
do not list implied . and ..
如果文件夹中只有目录而没有文件,这样做:
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 如果你觉得指令替代难看,可以使用 sed和 bc作为一个纯流来减去一个。
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
要获取目录的数量-导航 转到目录并执行
ls -l | grep -c ^d
如果您想计算具有类似名称的文件夹,如 folder01、 folder02、 folder03等,那么可以这样做
Ls-l | grep ^ d | grep-c 文件夹