Linux Bash递归脚本求目录最大深度作业求助
解决递归目录深度计算脚本的问题
看了你的脚本,我发现几个关键问题导致它无法正确计算最深子目录的深度,下面是问题分析和修正后的方案:
原脚本的核心问题
- 未初始化变量:
depth和max没有初始值,首次运行会触发算术运算错误 - 递归变量隔离:每个递归调用都是独立的子shell,子进程里修改的
max和depth不会传递回父进程,导致无法累积最大深度 list_dirs.sh调用错误:没有给它传递当前要遍历的子目录,始终用的是顶层目录的子列表- 输出逻辑混乱:在递归过程中就输出
max,会导致多次输出,而不是最终的最大深度
修正后的完整脚本
#!/bin/bash # 初始化参数:第1个参数是目标目录,第2个是当前深度(默认1),第3个是当前最大深度(默认1) target_dir="$1" current_depth=${2:-1} current_max=${3:-1} # 调用list_dirs.sh获取当前目录的子目录,确保传递正确的dir变量 sub_dirs=$(dir="$target_dir" source list_dirs.sh) # 遍历每个子目录进行递归处理 for sub in $sub_dirs; do # 递归调用脚本,传递子目录、当前深度+1、当前最大深度 child_max=$(./depthScript.sh "$target_dir/$sub" $((current_depth + 1)) "$current_max") # 更新最大深度,如果子目录返回的深度更大 if (( child_max > current_max )); then current_max=$child_max fi done # 返回当前路径下的最大深度(顶层调用时会输出最终结果) echo "$current_max"
关键改进说明
- 参数化传递状态:把当前深度和最大深度作为脚本的第2、3个参数传递,避免子shell变量隔离的问题,父进程能直接拿到子递归的结果
- 正确调用
list_dirs.sh:用dir="$target_dir" source list_dirs.sh的方式,确保脚本获取到当前要遍历的目录,正确输出其子目录列表 - 递归结果处理:用
child_max=$(./depthScript.sh ...)接收子脚本返回的最大深度,再和当前最大值比较更新 - 统一输出时机:只有在每个递归分支结束后返回当前的最大深度,顶层调用时才会输出最终的最深目录深度
测试方法
直接调用脚本并传入目标目录即可:
./depthScript.sh /path/to/your/test/directory
比如如果目录结构是a/b/c/d,脚本会返回4(每级目录+1,从a开始算第1级)。
内容的提问来源于stack exchange,提问作者Tezro
相关产品推荐
相关产品推荐

