我想用一个for循环来完成它。这就是我到目前为止想出的不起作用的东西。
for home in /home/ {.,/}*; do echo "$home"; done如果可能的话,我想不递归地做这件事。
发布于 2015-11-10 05:17:12
对于不递归的当前目录中的非目录类型,使用find:
find . ! -name . -prune ! -type d | grep -c /...for只有目录删除第二个or,或者对于所有的文件类型,完全删除-type测试。
在这种情况下,这很容易,因为没有递归,我们只能看到每个文件只有一个路径分隔符,因此对于计数的内容和位置没有任何混淆。当你应该计算文件时,计算换行符会导致麻烦--这两件事是不相关的。否则该怎么办呢?
find .//. | grep -c '^\.//\.'...will返回根植于当前目录的子对象的精确计数。
同样有效,但使用反向逻辑,因为它在内部引用换行符,而且可能更快,因为它只需要stat()每个目录,而不是每个组成文件:
\ls -1qRA . | grep -Exc \[^/]+如果您将-R选项删除到ls中,那么它也将在没有递归的情况下工作。
不过,上面可能会根据文件名中的多字节字符和不兼容的区域设置返回一个假计数。将LC_ALL=C放在符合POSIX的ls's环境中将防止这种情况发生,对于一棵相当大的树的深度计数来说,这样做毕竟只会在性能方面有所帮助。
发布于 2015-11-10 04:26:13
使用发现:
当您非递归地说时,是否意味着您只需要/home中的文件/目录的计数,而不需要任何子目录?如果是这样的话,您可以使用maxdepth选项将结果限制在顶层。
find /home -maxdepth 1 | wc -l用于:
i=0; for home in ~/*; do (( i++ )); done; echo $i注意双括号和封闭的i++之间的空格。
https://unix.stackexchange.com/questions/242002
复制相似问题