web-dev-qa-db-ja.com

サブディレクトリをループして、それぞれでコマンドを実行する

VCS(Git、Mercurial、SVN)に基づいてディレクトリに分類された一連のリポジトリがあります。 Subversionを使用すると、親ディレクトリでsvn update *を実行でき、各ディレクトリをループして、各リポジトリを期待どおりに更新しました。 GitやMercurialはそうではありません。

それを実行するために実行できるbashスクリプトを思いついて、ディレクトリをループし、それぞれのgit pullまたはhg pullをループします。私はbashスクリプトの経験があまりありません。

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

再帰的にする必要がある場合:

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

これにより、現在のディレクトリの下のすべてのディレクトリに移動し、.gitディレクトリがあるサブディレクトリでgit pullを実行します(-maxdepthで制限できます)。

GNU Parallel http:// www.gnu.org/software/parallel/がインストールされている場合、これを行うことができます:

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

これは並行して実行されるため、Gitサーバーのネットワーク接続の一部が遅い場合、速度が向上する可能性があります。

GNU Parallelの紹介ビデオをご覧ください:詳細は http://www.youtube.com/watch?v=OpaiGYxkSuQ

7
Ole Tange

これはうまくいくはずです

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

それを行うにはrecursivefindを使用せずにforloop

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