任务是: 运行文件时的输出将是输入目录中的子目录数(计算树中的所有子目录)。
我知道如何使用递归目录 -r
,但如何计算 shell 脚本文件中的所有这些数字?
答案1
统计所有目录包括隐藏的.
在以当前目录为根的树中
find . -type d -printf '\n' | wc -l
或者
find . -type d -printf x | wc -c
(你可以用任何单个字符代替x
: 如果你选择一个 shell 特有的字符,一定要用引号或转义它)。使用printf '\n' | wc -l
或printf x | wc -c
而不是传递文件名列表到wc -l
将确保计数正确,即使有目录的名称包含换行符。
这两个命令都包含起始目录.
- 如果你想要严格计数子然后目录减 1 或加-mindepth 1
find . -mindepth 1 -type d -printf '\n' | wc -l
或使用明确! -name .
排除.
目录。
如果你想排除隐藏目录(包括可能的非-hidden 隐藏子目录),然后修剪他们前任
find -mindepth 1 -type d \( -name '.*' -prune -o -printf x \) | wc -c
或者,使用 shell 的递归遍历树。例如使用 zsh
dirs=( **/(ND/) )
print $#dirs
(ND/)
在哪glob 限定符仅匹配**/
目录并包括隐藏(“ D
ot”)目录 -D
如果只想计算非隐藏目录,请省略。
你可以在 bash 中做类似的事情:
shopt -s nullglob dotglob globstar
set -f -- **/
printf '%d\n' "$#"
然而与 zsh 的/
限定符不同,**/
glob 模式匹配任何看起来像目录的东西 - 包括目录的符号链接。
答案2
尝试ls -l -R | grep -c ^d
在您的终端中从您想知道其中有多少个的目录运行。
*** 编辑 *** 使用下面的方法扫描并向用户提示变量路径。
#!/bin/bash
echo "Please enter path to scan:"
read path
ls -l -R $path | grep -c ^d