उपनिर्देशिका के माध्यम से लूपिंग और प्रत्येक में एक कमांड चल रहा है


47

मेरे पास उनके VCS (Git, Mercurial, SVN) के आधार पर निर्देशिकाओं में सॉर्ट किए गए रिपॉजिटरी का एक सेट है। तोड़फोड़ के साथ मैं svn update *मूल निर्देशिका में चलाने में सक्षम था और यह प्रत्येक निर्देशिका के माध्यम से लूप करेगा और अपेक्षा के अनुसार प्रत्येक रिपॉजिटरी को अपडेट करेगा। Git या Mercurial के मामले में ऐसा नहीं है।

मैं एक bash स्क्रिप्ट साथ आने के लिए है कि मैं निर्देशिका के माध्यम से और या तो ठीक है कि, पाश करने के लिए चला सकते हैं चाहते हैं git pullया hg pullप्रत्येक में। मेरे पास अभी बहुत बैश स्क्रिप्टिंग का अनुभव नहीं है।


यह स्पष्ट किया जा सकता है कि क्या आप चाहते हैं कि कमांड्स को पुनरावर्ती रूप से (सभी सबफ़ोल्डर्स में) निष्पादित किया जाए, जहां mj41 का उत्तर केवल वही है जो मैंने (यहाँ और अन्य एसओ साइटों से) आज़माया है।
r_alex_hall

* कि एक tweak के साथ कि मैं इस पर एक टिप्पणी में उल्लेख करता है।
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" \;

यह वर्तमान एक के तहत सभी निर्देशिकाओं में उतरेगा, और उन उपनिर्देशिकाओं पर एक गिट पुल का प्रदर्शन करेगा जिनके पास .it निर्देशिका है (आप इसे सीमित कर सकते हैं -maxdepth)।


@thprivileges: चतुर!
डेनिस विलियमसन

9
-execdirयहाँ बहुत बेहतर है:find . -type d -name .git -execdir sh -c "pwd && git pull" \;
daniel kullmann

यह मेरी व्यक्तिपरक राय में एक बेहतर जवाब ... मेरे लिए तुरंत काम किया .. है चीयर्स
Voke Ransom Anighoro

इस सवाल के विपरीत कि मुझे यहां से जोड़ा गया है, इस कमांड ने वास्तव में काम किया है। धन्यवाद।
user1445967

7

यदि आपके पास GNU समानांतर http: // www.gnu.org/software/parallel/ स्थापित है, तो आप ऐसा कर सकते हैं:

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

यह समानांतर में चलेगा, अगर कुछ जीआईटी सर्वरों का नेटवर्क कनेक्शन धीमा हो तो इससे चीजें तेज हो सकती हैं।

अधिक जानने के लिए GNU समानांतर के इंट्रो वीडियो देखें: 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ध्वज को हटाना , यह एकमात्र आदेश है जिसे मैंने बहुत सारी खोज में पाया है और यह कोशिश करता है कि एक कमांड को पुनरावर्ती रूप से निष्पादित किया जाए (सभी उपनिर्देशिकाओं में, न केवल निर्देशिका एक स्तर नीचे)।
r_alex_hall

0

बिना उपयोग किए, लेकिन पुनरावृत्ति करने के लिएfindforloop

for dir in ~/projects/git/*/*/; do (cd "$dir" && git pull); done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.