排除 bash 循环中的文件夹

Excluding folders in bash loop

我正在尝试编写一个脚本,将包含许多项目的 GitHub 回购分离成单独的回购,同时保留它们的 git 历史记录。我知道如何手动完成所有这些工作,但想通过编写脚本来为我完成这些工作来节省时间。

这是我目前所拥有的

脚本

#!/bin/bash
REPO_DIR="C:/Users/Jerred/GitKraken/harding-computer-science/"

cd "$REPO_DIR"

for X in "`find . -maxdepth 2 -mindepth 2 -type d`"
do
    if [[ "$X" == *"git"* ]]; then
        echo "NO MATCH: $X"
        continue;
    fi
    echo "$X"
done

这很好用,除了它包含应该排除的 .git 文件夹。由于某种原因,它不起作用。

输出

NO MATCH: ./.git/hooks    // This is ignored like I want
./.git/info               // This isn't ignored but it should be
./.git/logs
./.git/objects
./.git/refs
./COMP 151 - Programming II/Lab 10 Resources
./COMP 151 - Programming II/Lab 11 Resources

我怀疑是否需要它,但这是 GitHub 上的 repo

find 命令周围的双引号将其输出转换为一个字符串(其中包含新行)。您正在循环匹配 *"git"* 的单个 X 值。因此,您打印 NO MATCH: 后跟完整的字符串(及其新行)。证明:在循环的开头添加 echo foobar 并看到它只打印一次。

你可以试试:

find . -maxdepth 2 -mindepth 2 -type d ! -path ./.git/\*

哪个应该做你想做的(没有 NO MATCH 输出)。