web-dev-qa-db-fra.com

Faire une boucle dans les sous-répertoires et exécuter une commande dans chacun

J'ai un ensemble de référentiels triés dans des répertoires basés sur leur VCS (Git, Mercurial, SVN). Avec Subversion, j’ai pu exécuter svn update * dans le répertoire parent. Il parcourait chaque répertoire et mettait à jour chaque référentiel comme prévu. Ce n'est pas le cas pour Git ou Mercurial.

J'aimerais créer un script bash que je peux exécuter pour faire exactement cela, en parcourant les répertoires et git pull ou hg pull dans chacun. Je n'ai tout simplement pas beaucoup d'expérience de script bash.

45
Bryan Veloso
for dir in ~/projects/git/*; do (cd "$dir" && git pull); done
76
jtimberman

Si vous en avez besoin pour être récursif:

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

Cela descendra dans tous les répertoires sous le répertoire actuel et effectuera un tirage git sur les sous-répertoires contenant un répertoire .git (vous pouvez le limiter avec -maxdepth).

21
Dennis Williamson

Si vous avez GNU Parallel http: // www.gnu.org/software/parallel/ installé, vous pouvez le faire:

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

Cela fonctionnera en parallèle, donc, si certaines connexions réseau des serveurs git sont lentes, cela peut accélérer les choses.

Regardez la vidéo d'introduction de GNU Parallèle pour en savoir plus: http://www.youtube.com/watch?v=OpaiGYxkSuQ

7
Ole Tange

Cela devrait marcher

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

Pour le faire récursif sans utiliser find mais forloop

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