यदि मौजूद नहीं है तो cp फाइल कैसे बनाएं और डायरेक्टरी कैसे बनाएं?


15

मैं एक svn रिपॉजिटरी में संशोधित फ़ाइलों को किसी अन्य निर्देशिका में कॉपी करना चाहता हूं, जबकि उनकी निर्देशिका संरचना को रखना।

Awk और xargs manpage पढ़ने के बाद मुझे बदला हुआ फ़ाइल नाम पाने का एक तरीका मिल गया है:

$ svn status -q | awk '{ print $2 }' | xargs -d \\n -I '{}' cp '{}' /tmp/xen/

लेकिन समस्या यह है कि इस तरह से निर्देशिका संरचनाएं संरक्षित नहीं हैं, मैं इस तरह से फाइलों को कॉपी करना चाहता हूं:

./common/superp.c -> /tmp/xen/common/superp.c
./common/m2mgr.c -> /tmp/xen/common/m2mgr.c
./common/page_alloc.c -> /tmp/xen/common/page_alloc.c
./arch/x86/mm.c -> /tmp/xen/arch/x86/mm.c
./arch/x86/mm/shadow/private.h -> /tmp/xen/arch/x86/mm/shadow/private.h

मैंने cp कमांड को cp '{}' / tmp / xen / '{}' में बदलने की कोशिश की है, लेकिन उसने कहा कि ऐसी कोई फाइल या निर्देशिका नहीं है। क्या कोई प्रतिलिपि प्रतिलिपि फ़ाइल बनाने और यदि आवश्यक हो तो निर्देशिका बनाने का कोई तरीका है? और कृपया बताएं कि क्या यह कमांड चेन सरल किया जा सकता है। :-)

आपके सभी जवाबों के लिए शुक्रिया। चूंकि निर्देशिका थोड़ी बड़ी है, इसलिए मैं cp -R या rsync का उपयोग करके पूरी निर्देशिका की प्रतिलिपि नहीं बनाना चाहता। टार्क पाइप का उपयोग करने का सीके का सुझाव काफी उपयोगी है।

svn status -q | awk '{ print $2 }' | xargs tar cf -  | (cd /tmp/xen/; tar xvf -)

जवाबों:


12

त्वरित विचारों के जोड़े:

  • Mkdir -p $ (dirname FILE) में जोड़ें
  • क्या आप एक टार पाइप का उपयोग कर सकते हैं यह सब बाहर करने के लिए?

संपादित करें

 tar -cf archive.tar  `svn status -q | awk '{print $2}'`

संशोधित फ़ाइलों का एक संग्रह बनाना चाहिए। फिर:

  tar -xf archive.tar -C /tmp/xen

जहां चाहो वहां डाल देना चाहिए। यदि इसे एक चरण में होना चाहिए, तो यह भी संभव है।


4

rsync बहुत सरल बनाता है, यह वह उपकरण है जिसे मैं आमतौर पर संपूर्ण निर्देशिका संरचनाओं की प्रतिलिपि बनाने के लिए उपयोग करता हूं:

rsync -av /home/source/svn/repo /home/dest/svn/

यह रेपो निर्देशिका और / होम / डेस्ट / svn डायरेक्टरी में सभी सामग्री को बनाएगा, इसलिए आपके पास / होम / डेस्ट / एसवीएन / रेपो / होगा ...

तो आपके लिए उदाहरण:

rsync -rv ./ /tmp/xen/

-a, समय टिकटों को संरक्षित करेगा और अन्य चीजों के बीच पुनरावर्ती होगा, 'मैन rsync'।

यह समझने के बाद कि मैंने प्रश्न गलत पढ़ा है अपडेट करें:

निर्देशिका संरचना (टार वैकल्पिक) की नकल करने के लिए:

rsync -av --include='*/' --exclude='*' source destination

और फिर 20 मिनट पहले कहने से पहले फ़ाइलों को कॉपी करने के लिए:

find . -type f -mmin -20 -print0 | xargs -0 cp --target-directory /mydestdir/

यह स्पष्ट है, लेकिन यह सब कुछ सिंक करेगा, न कि केवल संशोधित फाइलें, सही?
सी.के.

उफ़, चूक गए
काइल ब्रान्ड

2

यहाँ संदर्भ के लिए एक लाइनर है:

svn status -q | awk '{print $2}' | xargs tar -c | tar -xC /tmp/xen

और अंग्रेजी में:

  • ब्याज की फाइलों की सूची प्राप्त करें svn status -q, जिन्हें इसमें डाला गया है ...
  • awk जो फ़ाइलपथ के साथ कॉलम को निकालता है: awk '{print $2}'
  • xargs का उपयोग फ़ाइलों की सूची को टार में देने के लिए किया जाता है, जो बदले में फ़ाइलों के टारबॉल को stdout में भेजता है: xargs tar -c
  • जो -xकि टारगेट डायरेक्टरी में तुरंत पुनः निकाला ( -C path) है:tar -xC /tmp/xen

1

"Mkdir -p" पथ बनाने के लिए "dirname" का उपयोग करें इसे बनाने के लिए, कुछ इस तरह से:

xargs -d \\n -l '{}' mkdir -p \`dirname '{}'\` && cp '{}' /tmp/xen/

1

rsync -a गहराई से 1 की तुलना में नई निर्देशिकाओं का निर्माण नहीं करता है, इसलिए rsync केवल आंशिक समाधान है और उदाहरण के लिए मेरे लिए उपयुक्त नहीं है (मैं एक उत्तर खोजने के लिए googled कि कैसे कुछ दूरस्थ पदानुक्रम के लिए rsync निर्देशिकाओं के बीच में कई निर्देशिकाएँ गायब हैं। )

संपादित करें: मेरा मतलब है, मेरे पास स्रोत dir: /home/user/projects/homework/1/1.1/ है और मैं इसे दूरस्थ रूप से rsync करना चाहता हूं: /home/user/projects/homework/1/1.1/ ... लेकिन गंतव्य अभी तक निर्देशिका / घर / उपयोगकर्ता / परियोजनाएं / होमवर्क नहीं है ... और मैं अन्य उपनिर्देशिकाओं को स्रोत मशीन में स्थानांतरित नहीं करना चाहता हूं जो / घर / उपयोगकर्ता / परियोजनाओं / में हैं

Edit2: rsync --relative विकल्प के साथ एक रास्ता मिला: उपरोक्त उदाहरण इस तरह होगा:

सीडी / होम / प्रोजेक्ट्स /; rsync -RR होमवर्क / 1 / 1.1 उपयोगकर्ता @ रिमोट: / होम / उपयोगकर्ता / प्रोजेक्ट /


0

मैं निम्नलिखित सुझाव दूंगा:

  • सब कुछ कॉपी करें
  • अनमॉडिफाइड फाइल्स ढूंढें और उन जगहों को हटा दें, जो संशोधित फाइल्स को उनके स्थानों पर छोड़ रहे हैं।

वैसे, आर फ्लैग कॉपी फ़ाइलों / फ़ोल्डरों के साथ पुनरावर्ती रूप से cp।

सी पि आर

0
  • में /tmp/f2फ़ाइलों के लिए निर्देशिका संरचना का निर्माण/tmp/f

    $ cd /tmp/f/
    $ find . -type f -exec dirname {} \; | uniq | xargs -I {} mkdir /tmp/f2/{} -p
    
  • नई नियति के लिए फ़ाइल की प्रतिलिपि बनाएँ /tmp/f2/

    $ cd /tmp/f
    $ find . -type f -exec cp  {}  /tmp/f2/{} -aPv \;
    
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.