![cd 到多个目录并执行命令的脚本](https://linux22.com/image/100416/cd%20%E5%88%B0%E5%A4%9A%E4%B8%AA%E7%9B%AE%E5%BD%95%E5%B9%B6%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4%E7%9A%84%E8%84%9A%E6%9C%AC.png)
我正在尝试编写一个可以稍后添加的脚本。基本上,我的主目录中遍布着 git 存储库的集合。我想保留它们位置的主列表,然后让脚本运行所有这些位置并运行命令git up
或git pull
其他内容。
我厌倦了必须cd
单独处理所有事情才能更新。我想一次性完成这一切,但它们的位置没有任何押韵或原因,而且我不希望仅仅为了适应某些脚本操作而重组我的主文件夹树。
我非常高兴拥有一个像配置文件一样的配置文件,随着时间的推移,我可以根据需要将更多目录附加到文件的开头。
编辑:
这就是我所在的地方:
CWD="$(pwd)";
cd ;
dir1="$HOME/FW/foo";
dir2="$HOME/FW/bar";
for repo in $dir1, $dir2;
do
cd "$repo"
git up
done
cd $CWD
哦,我使用的是 ZSH,而不是 bash...
答案1
#!/bin/bash
# This will attempt to do a `git pull` in any directories found in the
# present working directory.
for d in *; do
if [[ -d "$d"/.git ]]; then
( cd $d; git pull )
fi
done
答案2
实际上,您不必将目录更改为 git 存储库即可使用git
.您可以将工作目录传递git
给-C path
.
如果您想保留存储库列表,我建议使用数组:
repos=(
$HOME/somedir/repo1
"$HOME/somedir/with space/repo2"
)
for repo in $repos; do
git -C $repo $@
done
如果将其放入脚本中,例如使用 tha name multigit
,则可以git
对其运行任何命令,因为参数是 passad withing $@
。例如multigit pull
。
如果您不关心配置存储库列表,您甚至可以zsh
为您找到所有它们:
for repo in **/.git(/N); do
git -C ${repo:h} $@
done
**/.git(/N)
将递归搜索任何指定的目录.git
,并${repo:h}
删除路径的最后一个元素,在本例中.git
,为您留下存储库的路径。
奖励:您甚至可以获得Tab新命令的 -completion:
compdef '_dispatch git git' multigit