循环遍历子目录并在每个子目录中运行命令

循环遍历子目录并在每个子目录中运行命令

我有一组根据 VCS(Git、Mercurial、SVN)分类到目录中的存储库。使用 Subversion,我能够svn update *在父目录中运行,它会循环遍历每个目录并按预期更新每个存储库。Git 或 Mercurial 则不是这种情况。

我想写一个可以运行的 bash 脚本来执行此操作,循环遍历目录并在每个目录中执行任一操作git pullhg 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

相关内容