73 votes

Parcourir les sous-répertoires et exécuter une commande dans chacun d'eux

J'ai un ensemble de dépôts triés en répertoires en fonction de leur VCS (Git, Mercurial, SVN). Avec Subversion, j'ai pu exécuter svn update * dans le répertoire parent et il bouclera à travers chaque répertoire et mettra à jour chaque dépôt comme prévu. Ce n'est pas le cas pour Git ou Mercurial.

J'aimerais trouver un bash script que je puisse exécuter pour faire exactement cela, boucler les répertoires et soit git pull o hg pull dans chaque. Je n'ai pas beaucoup d'expérience en matière de script bash.

118voto

Loïc Wolff Points 14389
for dir in ~/projects/git/*; do (cd "$dir" && git pull); done

30voto

Damian Powell Points 315

Si vous avez besoin qu'il soit récursif :

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

Ceci va descendre dans tous les répertoires sous le répertoire courant, et effectuer un git pull sur les sous-répertoires qui ont un répertoire .git (vous pouvez le limiter avec -maxdepth ).

10voto

Ole Tange Points 4059

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

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

Cette opération sera exécutée en parallèle, donc si la connexion réseau de certains serveurs git est lente, cela peut accélérer les choses.

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

4voto

mj41 Points 141

Cela devrait fonctionner

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

2voto

loretoparisi Points 231

Pour le faire sans utiliser find mais forloop

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X