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


47

我有一组存储库,基于它们的VCS(Git,Mercurial,SVN)分类到目录中。使用Subversion,我可以svn update *在父目录中运行,它将遍历每个目录并按预期更新每个存储库。Git或Mercurial并非如此。

我想提出一个bash脚本,我可以运行它来完成该任务,遍历目录以及每个目录git pullhg pull每个目录。我只是没有太多的bash脚本编写经验。


可以弄清楚是否要递归执行命令(在所有子文件夹中),其中mj41的答案是我尝试过的唯一答案(从此处和在其他SO站点)。
r_alex_hall

*通过我在评论中提到的调整来做到这一点。
r_alex_hall

Answers:


81
for dir in ~/projects/git/*; do (cd "$dir" && git pull); done

2
Thnx ...但我也需要捕获错误。我该怎么办。我以前从未做过Shell编程。
shashwat

23

如果您需要递归:

find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull" \;

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


@thprivileges:聪明!
丹尼斯·威廉姆森

9
-execdir在这里要好得多:find . -type d -name .git -execdir sh -c "pwd && git pull" \;
丹尼尔·库尔曼

从我的主观观点来看,这是一个更好的答案……立即为我工作。干杯
Voke Ransom Anighoro 2015年

与在这里链接我的问题不同,此命令实际上有效。谢谢。
user1445967

7

如果您安装了GNU Parallel http:// www.gnu.org/software/parallel/,则可以执行以下操作:

cd ~/projects/git/; ls | parallel 'cd {} && git pull'

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

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


也许ls */要确保向给出一致的输入cd
Joe Corneli

4

这应该工作

find . -maxdepth 1 -type d -name '.git' -exec sh -c 'cd "{}" && pwd && git pull' \;

删除-maxdepth 1标记,这是我在很多搜索和尝试中唯一找到的命令,该命令以递归方式执行命令(在所有子目录中,而不仅仅是下一级的目录)。
r_alex_hall

0

做到递归而不使用find而是forloop

for dir in ~/projects/git/*/*/; do (cd "$dir" && git pull); done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.