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

Bry*_*oso 58 linux script bash shell

我有一组存储库根据它们的 VCS(Git、Mercurial、SVN)分类到目录中。使用 Subversion 我能够svn update *在父目录中运行,它会遍历每个目录并按预期更新每个存储库。对于 Git 或 Mercurial 而言,情况并非如此。

我想拿出一个bash脚本,我可以运行通过目录和要么做到这些,循环git pullhg pull在每个。我只是没有太多的 bash 脚本经验。

jti*_*man 100

for dir in ~/projects/git/*; do (cd "$dir" && git pull); done
Run Code Online (Sandbox Code Playgroud)

  • Thnx ...但我也需要捕获错误。我怎么能这样做。我以前从未做过 shell 编程。 (2认同)

Den*_*son 26

如果你需要它是递归的:

find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull" \;
Run Code Online (Sandbox Code Playgroud)

这将下降到当前目录下的所有目录,并对那些具有 .git 目录的子目录执行 git pull (您可以使用 限制它-maxdepth)。

  • `-execdir` 在这里要好得多:`find 。-type d -name .git -execdir sh -c "p​​wd && git pull" \;` (9认同)

Ole*_*nge 8

如果您安装了 GNU Parallel http://www.gnu.org/software/parallel/,您可以这样做:

cd ~/projects/git/; ls | parallel 'cd {} && git pull'
Run Code Online (Sandbox Code Playgroud)

这将并行运行,因此如果某些 git 服务器的网络连接速度较慢,这可能会加快速度。

观看 GNU Parallel 的介绍视频以了解更多信息:http : //www.youtube.com/watch?v=OpaiGYxkSuQ