[英]counting number of directories in a specific directory
如何计算特定目录中的文件夹数。 我正在使用以下命令,但它总是提供一个额外的命令。
find /directory/ -maxdepth 1 -type d -print| wc -l
例如,如果我有 3 个文件夹,则此命令提供 4。如果它包含 5 个文件夹,则该命令提供 6。这是为什么呢?
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
find . -mindepth 1 -maxdepth 1 -type d | wc -l
对于 find -mindepth
表示目录中重复的总数
-maxdepth
表示目录中递归的总数
-type d
表示目录
对于wc -l
表示计算输入的行数
如果文件夹中只有目录而没有文件,则这样做:
ls | wc -l
运行stat -c %h folder
并从结果中减去 2。 与此处的大多数其他解决方案(通常是find
或ls
加wc
)所需的 2 个(甚至 3 个)不同,这仅使用一个子进程。
使用 sh/bash:
echo $((`stat -c %h folder` - 2)) # 'echo' 是一个内置的 shell
使用 csh/tcsh:
@cnt = `stat -c %h 文件夹` - 2; echo $cnt # 'echo' 是一个内置的 shell
解释: stat -c %h folder
打印到文件夹的硬链接数,并且文件夹下的每个子文件夹都包含一个 ../ 条目,它是返回文件夹的硬链接。 您必须减去 2,因为计数中有两个额外的硬链接:
导航到您的驱动器并简单地执行的最佳方式
ls -lR | grep ^d | wc -l
并总共查找所有文件夹,包括子目录?
find /mount/point -type d | wc -l
...或查找根目录中的所有文件夹(不包括子目录)?
find /mount/point -maxdepth 1 -type d | wc -l
干杯!
我认为最简单的是
ls -ld images/* | wc -l
其中images
是您的目标目录。 -d 标志限制为目录,而 -l 标志将执行每行列表,与非常熟悉的wc -l
兼容用于行数。
我们可以使用以下命令找到的目录
ls -l | grep "^d" | wc -l
一些有用的例子:
计算当前目录中的文件
/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 ..
do not list implied . and ..
不按预期工作。 当我使用显示 ./ 和 ../ 的ls
时,结果计数错误。 解决方案:/bin/ls
而不是ls
要获取目录的数量 - 导航到目录并执行
ls -l | grep -c ^d
一个纯粹的 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
计算字符数。 这将计算所有目录(包括隐藏目录)的数量,不包括链接。
这里介绍的方法对于可能出现在文件名中的有趣字符(空格、换行符、全局字符等)都是安全的。
使用zsh
:
a=(*(/N)); echo ${#a}
N
是一个 nullglob, /
使其匹配目录, #
计数。 如果没有目录,它将巧妙地处理目录名称中的空格以及返回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
统计所有文件和子文件夹,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"
如果要使用正则表达式,请尝试:
ls -c | grep "^d" | wc -l
如果您想计算具有相似名称的文件夹,例如 folder01、folder02、folder03 等,那么您可以这样做
ls -l | grep ^d | grep -c 文件夹
最好的方法:
ls -la | grep -v total | wc -l
这为您提供了完美的计数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.