为何命令find . -type d | wc -l统计目录数比实际多1?
为什么
find . -type d统计目录数会多1? 这是个很常见的小坑,核心原因在于**find命令会把你指定的起始路径本身也纳入统计**:
- 当你执行
find . -type d时,find首先会检查你给出的起始点——也就是当前目录.,它本身就是一个目录,所以会被作为第一个匹配项输出。 - 举个直观例子:假设当前目录下有2个子目录
dir1和dir2,执行find . -type d的输出会是:
用. ./dir1 ./dir2wc -l统计就是3行,但实际你想统计的是当前目录下的子目录(包括嵌套的),数量是2个,所以结果就多了1个。
那为什么ls -lR | grep ^d | wc -l能得到正确结果?
ls -lR是递归列出所有文件和目录,但它的输出逻辑是:先列出当前目录里的内容(不包括当前目录本身),然后进入每个子目录列出里面的内容。- 用
grep ^d筛选时,只会匹配那些权限位以d开头的行——也就是各个子目录的条目,不会把当前目录.算进去,所以统计结果就是你预期的实际目录数。
关于文件统计时的“多一个”问题
你提到用find . -type f统计普通文件时也会多1个,这通常是因为**find会包含隐藏文件,而ls默认不显示隐藏文件**:
find命令默认会匹配所有文件,包括以.开头的隐藏文件(比如.gitignore、.bashrc这类)。- 而
ls -lR默认不会列出隐藏文件,所以用grep ^-筛选出的普通文件数量会比find的结果少——如果当前目录下恰好有1个隐藏文件,就会出现“多统计1个”的情况。
如果想让find的结果和ls的统计一致,可以加上! -name ".*"排除隐藏文件:
find . -type f ! -name ".*" | wc -l
反过来,如果想让ls显示隐藏文件,加上-a参数,统计结果就会和find一致了:
ls -lRa | grep ^- | wc -l
内容的提问来源于stack exchange,提问作者djembla95
相关产品推荐
相关产品推荐

