You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在多个一级子目录执行命令的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仓库,这段代码会自动初始化并完成第一次提交。

使用方法

  1. 给code.sh添加执行权限:chmod +x code.sh
  2. 在父目录下运行脚本:./code.sh

内容的提问来源于stack exchange,提问作者Joel007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:57:43