如何以目录递归方式计算所有文件夹和子文件夹

如何以目录递归方式计算所有文件夹和子文件夹

任务是: 运行文件时的输出将是输入目录中的子目录数(计算树中的所有子目录)

我知道如何使用递归目录 -r,但如何计算 shell 脚本文件中的所有这些数字?

答案1

统计所有目录包括隐藏的.在以当前目录为根的树中

find . -type d -printf '\n' | wc -l

或者

find . -type d -printf x | wc -c

(你可以用任何单个字符代替x: 如果你选择一个 shell 特有的字符,一定要用引号或转义它)。使用printf '\n' | wc -lprintf 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 限定符仅匹配**/目录并包括隐藏(“ Dot”)目录 -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

相关内容