![循环遍历子目录并在每个子目录中运行命令](https://linux22.com/image/1216433/%E5%BE%AA%E7%8E%AF%E9%81%8D%E5%8E%86%E5%AD%90%E7%9B%AE%E5%BD%95%E5%B9%B6%E5%9C%A8%E6%AF%8F%E4%B8%AA%E5%AD%90%E7%9B%AE%E5%BD%95%E4%B8%AD%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4.png)
我有一组根据 VCS(Git、Mercurial、SVN)分类到目录中的存储库。使用 Subversion,我能够svn update *
在父目录中运行,它会循环遍历每个目录并按预期更新每个存储库。Git 或 Mercurial 则不是这种情况。
我想写一个可以运行的 bash 脚本来执行此操作,循环遍历目录并在每个目录中执行任一操作git pull
。hg pull
我只是没有太多的 bash 脚本编写经验。
答案1
for dir in ~/projects/git/*; do (cd "$dir" && git pull); done
答案2
如果需要递归的话:
find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull" \;
这将进入当前目录下的所有目录,并对具有 .git 目录的子目录执行 git pull (您可以使用 限制它-maxdepth
)。
答案3
如果你有 GNU Parallel http://www.gnu.org/software/parallel/安装后你可以这样做:
cd ~/projects/git/; ls | parallel 'cd {} && git pull'
这将并行运行,因此如果某些 git 服务器的网络连接较慢,这可能会加快速度。
如果目录列表 < 128 KB,您还可以执行以下操作:
parallel 'cd {} && git pull' ::: ~/projects/git/*/
如果您想跟踪拉动情况(需要版本 20230322):
parallel --ll 'cd {} && git pull' ::: ~/projects/git/*/
观看 GNU Parallel 的介绍视频以了解更多信息: http://www.youtube.com/watch?v=OpaiGYxkSuQ
答案4
find
不使用but来做到这一点forloop
for dir in ~/projects/git/*/*/; do (cd "$dir" && git pull); done