任何人都可以告诉我为什么命令
find . -type d | wc -l
显示一个目录多于实际目录数?该命令应该从我所站的目录中打印多个目录和子目录。命令
ls -lR | grep ^d | wc -l
做同样的事情,但在这种情况下,我得到正确的数字。我使用f
或 - (文件)时的情况也是如此。它只添加了一个目录/文件。
答案 0 :(得分:2)
有两种可能的错误来源:
-printf
)要在使用GNU find时消除这两者:
find . -mindepth 1 -type d -printf '\n' | wc -l
-mindepth 1
可防止命名参数(.
)匹配。-printf '\n'
代替默认-print
操作可确保名称本身无法更改文件的计数方式。-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是唯一可以安全使用的字符,因为它不允许存在于路径中。)
-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