अगर मैं सभी की नकल करना चाहता था *.so
से फाइल src
करने के लिए dst
मुझे क्या करना चाहते हैं:
cp src/*.so dst
हालाँकि, मैं सभी *.so
फाइलों को src से कॉपी करना चाहता हूँ और यह उप-विभाजनों में है dst
। कोई सुराग?
अगर मैं सभी की नकल करना चाहता था *.so
से फाइल src
करने के लिए dst
मुझे क्या करना चाहते हैं:
cp src/*.so dst
हालाँकि, मैं सभी *.so
फाइलों को src से कॉपी करना चाहता हूँ और यह उप-विभाजनों में है dst
। कोई सुराग?
जवाबों:
प्रयत्न:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grep
उपयोग किए जाने वाले सरल शेल पैटर्न को दूर करने की पैटर्न मिलान क्षमता -name
है find
। पैरामीटर xargs
से भी अधिक शक्तिशाली है । -exec
find
यदि आप बैश का उपयोग कर रहे हैं, तो आप फ़ाइलों और निर्देशिकाओं का मिलान globstar
करने के लिए शेल विकल्प को चालू कर सकते हैं :
shopt -s globstar
cp src/**/*.so dst
यदि आपको उन फ़ाइलों को खोजने की आवश्यकता है जिनके नाम के साथ शुरू होता है .
, और / या निर्देशिका में और जिनके नाम के साथ फाइलें शुरू होती हैं .
, तो dotglob
विकल्प भी सेट करें (जैसे, साथ shopt -s dotglob
)। आप उन दोनों को एक कमांड में सेट कर सकते हैं:
shopt -s globstar dotglob
मैंने माइक द्वारा सुझाए गए आदेश की कोशिश की:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
लेकिन यह सभी फाइलों को निर्देशिका में डंप करने के साथ समाप्त हो गया, dst
क्योंकि उनके सापेक्ष पथ खो गए थे।
रिश्तेदार रास्तों को रखने के लिए कमांड को इसे संशोधित करने की आवश्यकता है:
find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
dst
। मामले में ऐसा नहीं है, का उपयोग करें cp --parents
। इसके अलावा, फ़ाइलनाम को उद्धृत करना सुनिश्चित करें। इस प्रकार: ... | xargs -i cp --parents "{}" dst
(ध्यान दें कि अंतिम तर्क cp
अब "बस" गंतव्य निर्देशिका है)। -t
ध्वज का उपयोग करके कमांड को और भी छोटा (और शायद तेज) किया जा सकता है ... | xargs cp --parents -t dst
:।
... | xargs cp {} --parents -t dst.
--parents
उपलब्ध नहीं है। मैंने ditto
इसके स्थान पर उपयोग किया : stackoverflow.com/questions/11246070/cp-parents-option-on-mac
इसे करने का एक और तरीका इस प्रकार है:
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cp
प्रक्रियाओं: ... -exec cp -t dst/ {} +
।
-exec
करते हैं ;
, {}
तो एक समय में एक पथ द्वारा प्रतिस्थापित किया जाता है। आपको cp
हर फ़ाइल के लिए एक अलग मिलता है । साथ +
वाक्य रचना find
की जगह {}
एक से अधिक परिणाम के साथ (कमांड लाइन लंबाई की एक प्रणाली द्वारा परिभाषित सीमा तक; प्रतिबंध: {}
से पहले आखिरी बात होना चाहिए +
, इसलिए cp -t
)। किसी प्रक्रिया को बनाना और समाप्त करना अपेक्षाकृत महंगी बात है। इस कारण से +
जब भी आप बहुत सारे परिणामों की अपेक्षा करते हैं तो इसका उपयोग करना अच्छा होता है। इस मामले में बहुत सारी फाइलें कॉपी करने में काफी समय लग सकता है, इसलिए यह अंतर किसी का ध्यान नहीं जा सकता है; फिर भी यह एक अच्छा अभ्यास है।
Grep को find -name के उपयोग से बदला जा सकता है :
find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
find
पैटर्न मिलान और कमांड निष्पादित कर सकते हैं। पाइप के लिए कोई ज़रूरत नहीं है इसके उत्पादन:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'