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


47

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

私は、ディレクトリを通って、どちらか正確には、ループを行うために実行することができますbashスクリプトを思い付くしたいと思いますgit pullhg pull、それぞれに。私はbashスクリプトの経験があまりありません。


コマンドを再帰的に(すべてのサブフォルダーで)実行するかどうかを明確にすることができます。mj41の答えは、これを行う(ここからおよび他のSOサイトで)私が試した唯一のものです。
r_alex_hall

*私はそれについてのコメントで言及している微調整を行います。
r_alex_hall

回答:


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

2
Thnx ...しかし、私もエラーをキャプチャする必要があります。どうすればできますか。シェルプログラミングを行ったことはありません。
shashwat

23

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

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

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


@thprivileges:賢い!
デニスウィリアムソン

9
-execdirここではるかに良いです:find . -type d -name .git -execdir sh -c "pwd && git pull" \;
ダニエルクルマン

これは私の主観的な意見では、より良い答えは...私のためにすぐに勤務。..乾杯
Voke身代金Anighoro

ここで私をリンクした質問とは異なり、このコマンドは実際に機能しました。ありがとうございました。
user1445967

7

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


たぶん、ls */あなたは首尾一貫した入力をに与えていることを確認するために行うでしょうcd
ジョーコルネリ

4

これは動作するはずです

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

-maxdepth 1フラグを削除すると、これはコマンドを再帰的に実行する多くの検索と試行で見つかった唯一のコマンドです(1レベル下のディレクトリだけでなく、すべてのサブディレクトリで)。
r_alex_hall

0

これを行うには、再帰的使用せずに、findしかし、forloop

for dir in ~/projects/git/*/*/; do (cd "$dir" && git pull); done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.