서브 디렉토리를 반복하고 각각에서 명령 실행


47

VCS (Git, Mercurial, SVN)를 기반으로 디렉토리로 정렬 된 저장소 세트가 있습니다. Subversion을 사용하면 svn update *부모 디렉토리에서 실행할 수 있었고 각 디렉토리를 반복하고 각 저장소를 예상대로 업데이트합니다. Git 또는 Mercurial의 경우에는 해당되지 않습니다.

내가 디렉토리를 통해 하나 정확히, 루프를 수행하기 위해 실행할 수있는 bash는 스크립트를 마련하려는 git pull또는 hg pull각. 나는 bash 스크립팅 경험이별로 없다.


명령이 재귀 적으로 (모든 하위 폴더에서) 실행되는지 여부를 명확히 할 수 있습니다. 여기서 mj41의 대답은 내가 시도한 유일한 것입니다 (여기 및 다른 SO 사이트에서).
r_alex_hall

* 주석에 언급 한 조정으로 그 작업을 수행합니다.
r_alex_hall

답변:


80
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" \;
다니엘 kullmann

이것은 내 주관적인 견해에서 더 나은 대답입니다 ... 나를 위해 즉시 일했습니다 .. 건배
Voke Ransom 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.
Joe Corneli

4

이 작동합니다

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

-maxdepth 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.