Looping através de subdiretórios e executando um comando em cada

42

Eu tenho um conjunto de repositórios classificados em diretórios baseados em seus VCS (Git, Mercurial, SVN). Com o Subversion eu consegui executar svn update * no diretório pai e ele passaria por cada diretório e atualizaria cada repositório conforme o esperado. Esse não é o caso do Git ou do Mercurial.

Eu gostaria de criar um script bash que eu possa executar para fazer exatamente isso, fazer um loop pelos diretórios e git pull ou hg pull em cada. Eu simplesmente não tenho muita experiência em scripts.

    
por Bryan Veloso 21.09.2009 / 23:34

5 respostas

72
for dir in ~/projects/git/*; do (cd "$dir" && git pull); done
    
por 22.09.2009 / 00:04
18

Se você precisar que ele seja recursivo:

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

Isto descerá em todos os diretórios sob o atual, e executará um git pull naqueles subdiretórios que possuem um diretório .git (você pode limitá-lo com -maxdepth ).

    
por 22.09.2009 / 00:31
7

Se você tem o GNU Parallel http: // www.gnu.org/software/parallel/ instalado, você pode fazer isso:

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

Isso funcionará em paralelo, portanto, se algumas das conexões de rede dos servidores git estiverem lentas, isso pode acelerar as coisas.

Assista ao vídeo de introdução do GNU Parallel para saber mais: link

    
por 22.08.2010 / 22:07
3

Isso deve funcionar

find . -maxdepth 1 -type d -name '.git' -exec sh -c 'cd "{}" && pwd && git pull' \;
    
por 05.06.2013 / 13:16
0

Para fazer recursivo sem usar find , mas forloop

for dir in ~/projects/git/*/*/; do (cd "$dir" && git pull); done
    
por 06.10.2016 / 14:45