Alt Dizinler Arasında Döngü Yapma ve Her Birinde Komut Çalıştırma


47

VCS'lerini (Git, Mercurial, SVN) temel alarak dizine ayrılmış bir dizi depoya sahibim. Subversion ile svn update *üst dizinde çalışabildim ve her dizinde döngü kurar ve her depoyu beklendiği gibi güncellerdi. Git veya Mercurial için durum böyle değil.

Bunu yapmak için çalıştırabileceğim, dizinler arasında ya git pullda hg pullher birinde ya da her birinde çalıştırabileceğim bir bash betiği bulmak istiyorum . Sadece çok fazla basma betiği tecrübem yok.


Komutların özyinelemeli olarak (tüm alt klasörlerde) yürütülmesini isteyip istemediğiniz açıklığa kavuşturulabilir; burada mj41'in cevabı bunu yapan tek bir şey (buradan ve diğer SO sitelerinde).
r_alex_hall

* Bunu bir yorumda bahsettiğim bir çimdik ile yapar.
r_alex_hall

Yanıtlar:


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

2
Thnx ... ama hataları da yakalamam gerekiyor. Bunu nasıl yapabilirim. Daha önce hiç kabuk programlama yapmamıştım.
shashwat

23

Özyinelemeli olması gerekirse:

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

Bu, geçerli olanın altındaki tüm dizinlere iner ve .git dizini olan alt dizinlerde bir gitme işlemi gerçekleştirir (bunu sınırlandırabilirsiniz -maxdepth).


@ ayrıcalıklar: zeki!
Dennis Williamson,

9
-execdirburada çok daha iyi:find . -type d -name .git -execdir sh -c "pwd && git pull" \;
daniel kullmann

Bu .. Alkış benim için hemen çalıştı benim sübjektif görüşüme göre daha iyi bir yanıt ve ...
VoKe Ransom Anighoro

Beni buraya bağlayan sorunun aksine, bu komut gerçekten işe yaradı. Teşekkür ederim.
user1445967

7

GNU Parallel http: // www.gnu.org/software/parallel/ kurulu ise bunu yapabilirsiniz:

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

Bu paralel olarak çalışır, bu yüzden git sunucuların ağ bağlantılarının bazıları yavaşsa bu durumları hızlandırabilir.

Daha fazla bilgi için GNU Parallel için tanıtım videosunu izleyin: http://www.youtube.com/watch?v=OpaiGYxkSuQ


Belki de ls */tutarlı bir girdi verdiğinden emin olmalısın cd.
Joe Corneli

4

Bu çalışmalı

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

-maxdepth 1bayrağını kaldırarak, çokça arama yaptığımda ve bir komutu yinelemeli olarak çalıştıran tek komut budur (tüm alt dizinlerde, sadece bir seviye aşağıdaki dizinlerde değil).
r_alex_hall

0

Bunu yapmak için özyinelemeli kullanmadan findancakforloop

for dir in ~/projects/git/*/*/; do (cd "$dir" && git pull); done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.