"找到。 -type d | wc -l"显示比实际计数多1个目录

时间:2018-03-21 18:19:07

标签: bash

任何人都可以告诉我为什么命令

find . -type d | wc -l

显示一个目录多于实际目录数?该命令应该从我所站的目录中打印多个目录和子目录。命令

ls -lR | grep ^d | wc -l

做同样的事情,但在这种情况下,我得到正确的数字。我使用f或 - (文件)时的情况也是如此。它只添加了一个目录/文件。

4 个答案:

答案 0 :(得分:2)

有两种可能的错误来源:

  • 当前目录本身
  • 名称中包含字面换行符的目录

GNU find(带-printf

要在使用GNU find时消除这两者:

find . -mindepth 1 -type d -printf '\n' | wc -l
  • 使用-mindepth 1可防止命名参数(.)匹配。
  • 使用-printf '\n'代替默认-print操作可确保名称本身无法更改文件的计数方式。

GNU BSD查找(-print0

使用现代BSD find(与MacOS一样),您可能没有-printf,但仍然会-print0。因此,对于与两种主要实现兼容的代码:

find . -mindepth 1 -type d -print0 | tr -cd '\0' | wc -c

tr -cd '\0'删除NUL以外的所有字符; wc -c计算流中剩余的字符数 - 因此,计算剩余的NUL分隔符,从而计算文件。 (NUL是唯一可以安全使用的字符,因为它不允许存在于路径中。)

POSIX查找(使用-exec

如果您没有-printf-print0,您仍然可以将安全打印的内容(如参数数量)委托给shell:

find . -mindepth 1 -type d -exec sh -c 'echo "$#"' _ {} + | paste -sd+ - | bc

答案 1 :(得分:1)

它也会计算当前目录。如果要消除这种情况,可以将mindepth变量设置为1。

$ find . -mindepth 1 -type d | wc -l

只会提供子目录的计数......

答案 2 :(得分:-1)

不要打印dirname,而是打印一个点。如果你不像我们大多数人一样收集带有换行符的dirs,那么对wc -l的管道当然是一个简单的解决方案 - 你只需要知道何时放弃它。

concat=$(find . -mindepth 1 -type d -printf ".")
echo ${#concat}
66

答案 3 :(得分:-1)

find也会找到当前目录.。您可能还有其他以.开头的目录,例如.config

递归计算所有目录,包括以.开头的目录:

find * .* -type d | wc -l

以递归方式计算所有目录,但不包括以.开头的目录:

find * -type d | wc -l