วนลูปผ่านไดเรกทอรีย่อยและเรียกใช้คำสั่งในแต่ละรายการ


42

ฉันมีชุดของที่เก็บเรียงลำดับลงในไดเรกทอรีตาม VCS (Git, Mercurial, SVN) ของพวกเขา ด้วยการโค่นล้มฉันสามารถทำงานได้ svn update * ในไดเรกทอรีหลักและจะวนซ้ำแต่ละไดเรกทอรีและอัปเดตที่เก็บแต่ละรายการตามที่คาดไว้ นั่นไม่ใช่กรณีของ Git หรือ Mercurial

ฉันต้องการสร้างสคริปต์ทุบตีที่ฉันสามารถเรียกใช้เพื่อทำสิ่งนั้นได้อย่างแน่นอนวนรอบไดเรกทอรีต่างๆ git pull หรือ hg pull ในแต่ละ. ฉันไม่ได้มีประสบการณ์การเขียนสคริปต์ทุบตีมากนัก

คำตอบ:


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

2
ขอบคุณ ... แต่ฉันต้องจับข้อผิดพลาดเช่นกัน ฉันจะทำเช่นนั้นได้อย่างไร ฉันไม่เคยเขียนโปรแกรมเชลล์มาก่อน
shashwat

20

หากคุณต้องการให้เป็นแบบเรียกซ้ำ:

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

สิ่งนี้จะสืบสู่ไดเรกทอรีทั้งหมดภายใต้ไดเรกทอรีปัจจุบันและดำเนินการดึง git บนไดเรกทอรีย่อยที่มีไดเรกทอรี. git (คุณสามารถ จำกัด ด้วย -maxdepth )


@thprivileges: ฉลาด!
Dennis Williamson

8
-execdir ดีกว่ามากที่นี่: find . -type d -name .git -execdir sh -c "pwd && git pull" \;
daniel kullmann

นี่เป็นคำตอบที่ดีกว่าในความเห็นส่วนตัวของฉัน ... ทำงานได้ทันทีสำหรับฉัน .. ไชโย
Voke Ransom Anighoro

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

3

สิ่งนี้น่าจะใช้ได้

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

0

ที่จะทำมัน recursive โดยไม่ต้องใช้ find แต่ forloop

for dir in ~/projects/git/*/*/; do (cd "$dir" && git pull); done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.