Scorrere le sottodirectory ed eseguire un comando in ciascuna


47

Ho una serie di repository ordinati in directory in base al loro VCS (Git, Mercurial, SVN). Con Subversion sono stato in grado di eseguire svn update *nella directory padre e sarebbe scorrere attraverso ogni directory e aggiornare ogni repository come previsto. Questo non è il caso di Git o Mercurial.

Vorrei inventare uno script bash che posso eseguire per fare esattamente quello, scorrere le directory e in git pullo hg pullin ognuna di esse. Semplicemente non ho molta esperienza di scripting bash.


Si potrebbe chiarire se si desidera che i comandi vengano eseguiti in modo ricorsivo (in tutte le sottocartelle), dove la risposta di mj41 è l'unica che ho provato (da qui e in altri siti SO) che lo fa.
r_alex_hall

* Lo fa con una modifica che menziono in un commento.
r_alex_hall

Risposte:


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

2
Grazie ... ma devo catturare anche gli errori. Come posso farlo. Non avevo mai programmato la shell prima.
Shashwat,

23

Se ne hai bisogno per essere ricorsivo:

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

Questo scenderà in tutte le directory sotto quella corrente ed eseguirà un git pull su quelle sottodirectory che hanno una directory .git (puoi limitarla con -maxdepth).


@thprivileges: clever!
In pausa fino a nuovo avviso.

9
-execdirè molto meglio qui:find . -type d -name .git -execdir sh -c "pwd && git pull" \;
daniel kullmann il

Questa è una risposta migliore secondo la mia opinione soggettiva ... Ha funzionato immediatamente per me .. Saluti
Voke Ransom Anighoro

A differenza della domanda che mi ha collegato qui, questo comando ha funzionato. Grazie.
user1445967

7

Se hai GNU Parallel http: // www.gnu.org/software/parallel/ installato puoi farlo:

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

Questo funzionerà in parallelo, quindi se alcune connessioni di rete dei server git sono lente, questo potrebbe accelerare le cose.

Guarda il video introduttivo di GNU Parallel per saperne di più: http://www.youtube.com/watch?v=OpaiGYxkSuQ


Forse ls */assicurati di dare un input coerente a cd.
Joe Corneli,

4

Questo dovrebbe funzionare

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

rimuovendo il -maxdepth 1flag, questo è l'unico comando che ho trovato in molte ricerche e tentativi che esegue un comando in modo ricorsivo (in tutte le sottodirectory, non solo nelle directory di livello inferiore).
r_alex_hall

0

Per farlo ricorsivo senza usare findmaforloop

for dir in ~/projects/git/*/*/; do (cd "$dir" && git pull); done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.