在多个一级子目录执行命令的Bash脚本问题求助
解决Bash脚本遍历一级子目录执行Git命令的问题
我来帮你排查并解决这两个问题,先拆解下你遇到的错误原因,再给出可行的解决方案:
错误原因分析
第一个错误:fatal: not a git repository...
你之前的命令find ./* -mindepth 0 -maxdepth 0 -type d -exec git add -A {} \;是在父目录下执行git add操作,而父目录本身并不是Git仓库(没有.git文件夹),所以Git会报错。而且git add -A {}的写法是把子目录作为父仓库里的文件来添加,但你的需求应该是每个一级子目录都是独立的Git仓库,需要进入子目录执行Git命令。
第二个错误:find: missing argument to '-exec'
-exec参数要求后面跟着完整的命令,并用;或+结尾。你用了&&这种Shell逻辑运算符,find无法识别,必须把包含&&的命令用sh -c包裹起来,让Shell来解析执行。另外你写的"My Message"{}缺少空格,也会导致语法问题。
可行的解决方案
这里提供两种实现方式,都能精准遍历一级子目录(不包含子子文件夹),并在每个目录内执行Git命令:
方式一:用while read遍历(可读性更强)
把以下内容写入code.sh:
#!/bin/bash # 遍历当前目录下的所有一级子目录(排除当前目录本身) find . -maxdepth 1 -type d ! -name "." | while read -r sub_dir; do echo "=== 处理目录: $sub_dir ===" # 进入子目录,失败则跳过 cd "$sub_dir" || { echo "无法进入目录 $sub_dir,跳过"; continue; } # 检查是否为Git仓库,不是则初始化(可选) if [ ! -d ".git" ]; then echo "初始化Git仓库..." git init git add -A git commit -m "Initial commit" else # 暂存所有变更 git add -A # 检查是否有可提交的变更,避免空提交 if git diff --cached --quiet; then echo "无变更需要提交" else git commit -m "My Message" fi fi # 返回父目录 cd .. done
方式二:用find -exec(更简洁)
#!/bin/bash find . -maxdepth 1 -type d ! -name "." -exec sh -c ' sub_dir="$1" echo "=== 处理目录: $sub_dir ===" cd "$sub_dir" || exit 1 if [ ! -d ".git" ]; then echo "初始化Git仓库..." git init git add -A git commit -m "Initial commit" else git add -A if ! git diff --cached --quiet; then git commit -m "My Message" else echo "无变更需要提交" fi fi ' _ {} \;
关键细节说明
find . -maxdepth 1 -type d ! -name ".":精准匹配当前目录下的一级子目录,排除当前目录(.),不会遍历子子文件夹。cd "$sub_dir" || ...:确保进入子目录失败时不会执行后续Git命令,避免报错扩散。git diff --cached --quiet:检查暂存区是否有变更,避免执行空提交(Git会拒绝空提交)。- 可选的Git初始化逻辑:如果你的一级子目录还没创建Git仓库,这段代码会自动初始化并完成第一次提交。
使用方法
- 给
code.sh添加执行权限:chmod +x code.sh - 在父目录下运行脚本:
./code.sh
内容的提问来源于stack exchange,提问作者Joel007
相关产品推荐
相关产品推荐

