दो निर्देशिकाओं को कॉपी-मर्ज कैसे करें?


112

लिनक्स में इस संरचना के साथ मेरे पास दो निर्देशिका चित्र और छवियाँ 2 हैं:

/images/ad  
/images/fe  
/images/foo  

... और अन्य 4000 फ़ोल्डर

और दूसरा इस प्रकार है:

/images2/ad  
/images2/fe  
/images2/foo

... और अन्य 4000 फ़ोल्डर

इनमें से प्रत्येक फ़ोल्डर में चित्र होते हैं और छवियों के अंतर्गत निर्देशिकाओं के नाम और images2 बिल्कुल समान हैं, हालांकि उनकी सामग्री अलग है। तब मैं जानना चाहता हूं कि मैं छवियों / विज्ञापन में / images2 / ad की छवियों को कैसे कॉपी-मर्ज कर सकता हूं, / images2 / foo की छवियां / foo में और इतने पर सभी 4000 फ़ोल्डरों के साथ ।।


1
क्या दोनों डायरेक्टरी में एक ही नाम की अंतिम फाइलें हैं?
बस_माँ

नहीं ... उदाहरण के लिए छवियों / विज्ञापन में 1.jpg, 2.jpg और 3.jpg हैं। लेकिन images2 / ad में 4.jpg और 5.jpg
ssierral

4
@AmirAliAkbari, मुझे नहीं लगता कि यह एक डुप्लिकेट है - दूसरा सवाल मूल रूप से 'क्या एमवी विलय कर रहा है?' (उत्तर: नहीं)। यह प्रश्न 2 निर्देशिका पदानुक्रम को कैसे मर्ज करने के बारे में है।
मैक्सक्लेपज़िग

जवाबों:


173

यह rsync के लिए एक नौकरी है । शेल लूप के साथ मैन्युअल रूप से ऐसा करने का कोई लाभ नहीं है जब तक आप उन्हें कॉपी करने के बजाय फ़ाइल को स्थानांतरित नहीं करना चाहते।

rsync -a /path/to/source/ /path/to/destination

आपके मामले में:

rsync -a /images2/ /images/

(ध्यान दें कि अनुगामी स्लैश चालू है images2, अन्यथा यह कॉपी होगा /images/images2।)

यदि दोनों निर्देशिकाओं में समान नाम वाली छवियां मौजूद हैं, तो ऊपर दी गई कमांड के /images/SOMEPATH/SOMEFILEसाथ ओवरराइट हो जाएगी /images2/SOMEPATH/SOMEFILE। यदि आप केवल पुरानी फ़ाइलों को बदलना चाहते हैं, तो विकल्प जोड़ें -u। यदि आप संस्करण को हमेशा अंदर रखना चाहते हैं /images, तो विकल्प जोड़ें --ignore-existing

यदि आप /images2rsync के साथ फ़ाइलों को स्थानांतरित करना चाहते हैं , तो आप विकल्प पास कर सकते हैं --remove-source-files। तब rsync बारी-बारी से सभी फाइलों को कॉपी करता है, और जब यह हो जाता है तो प्रत्येक फाइल को हटा देता है। यदि स्रोत और गंतव्य निर्देशिका एक ही फाइल सिस्टम पर हैं, तो यह बढ़ने की तुलना में बहुत धीमा है।


14
..आदि -२ यदि आप प्रगति देखना चाहते हैं ..
Meetai.com

1
मुझे लगता है कि यहाँ एक मुश्किल खोल पाश का उपयोग करने का कोई फायदा नहीं है, भले ही आप उन्हें कॉपी करने के बजाय उन्हें स्थानांतरित करना चाहते हैं - उस मामले में बस उपयोग करें rsync, फिर rm -r /images
वाइल्डकार्ड

1
मैं यह भी बताना चाहता हूं कि प्रत्येक निर्देशिका के लिए अनुगामी स्लैश को शामिल करना महत्वपूर्ण है । उदाहरण के लिए, यदि आप बस भागते हैं rsync -a images images2, तो यह छवियों को मर्ज करने के बजाय छवियों को कॉपी करेगा।
काइल

1
@ s3cur3 ओह। 2 से (निहित) 1. यह एकतरफा है। धन्यवाद, मैंने अपना जवाब तय कर दिया।
गिलेस

1
@MaxCoplan सं। रुपये एक इंटरैक्टिव उपकरण नहीं है।
गिल्स

43

सबसे अच्छा विकल्प, जैसा कि पहले से ही पोस्ट किया गया है, बेशक rsync है। फिर भी इस काम को करने के लिए यूनिसन एक बेहतरीन सॉफ्टवेयर होगा। दोनों को कई ऑपरेटिंग सिस्टम में इस्तेमाल किया जा सकता है।

rsync

rsync स्रोत से गंतव्य तक एक दिशा में सिंक्रोनाइज़ करता है। इसलिए निम्नलिखित कथन

rsync -avh --progress Source Destination

स्रोत से गंतव्य तक सब कुछ सिंक करता है । मर्ज किए गए फ़ोल्डर को गंतव्य में रहता है ।

-a का अर्थ "संग्रह" है और स्रोत से गंतव्य तक लगभग हर चीज को संरक्षित करने के लिए पुनरावर्ती सब कुछ कॉपी करता है।

-v अधिक आउटपुट ("वर्बोज़") देता है।

-मानव पठनीय के लिए।

- यह दिखाने के लिए कि कितना काम किया जाता है।

यदि आप केवल चाहते को अद्यतन गंतव्य फ़ोल्डर नए के साथ स्रोत फ़ोल्डर से फाइल:

rsync -avhu --progress source destination

सामंजस्य

unison दोनों दिशाओं में सिंक्रोनाइज़ करता है। इसलिए निम्नलिखित कथन

unison Source Destination

दोनों निर्देशिकाओं को दोनों दिशाओं में सिंक करता है और अंत में स्रोत गंतव्य के बराबर होता है। यह स्रोत से गंतव्य तक और इसके विपरीत दो बार rsync करने जैसा है।

अधिक उन्नत उपयोगों के लिए मैन पेज या निम्न वेबसाइट देखें:

  1. https://www.cis.upenn.edu/~bcpierce/unison/
  2. https://rsync.samba.org/

2
मैं यह उल्लेख करना चाहता हूं कि फ़ोल्डर का सही रास्ता अंत में पीछे चल रहे स्लैश के साथ होना चाहिए rsync -avh --progress source/ destination/, अन्यथा गंतव्य फ़ोल्डर में स्रोत फ़ोल्डर बनाया जाएगा, कम से कम मेरे मामले में ऐसा था।
इलेक्ट्रो

यह मेरे लिए बहुत अच्छा काम करता है (फ़ोल्डर्स में अनुगामी स्लैश के साथ)। धन्यवाद!
लियोपोल्डो सैंसिएक

5
for dir in images2/*; do mv "$dir"/* "images/$(basename "$dir")"; done

images2विस्तारित ग्लोब का उपयोग करने की सभी सामग्रियों पर लूप करें (पार्सिंग के साथ समस्याओं से बचने के लिए ls) फिर mvउन वस्तुओं की सामग्री को मिलान करने के लिए images। ग्लोबड पथ से basenameअग्रणी पट्टी करने के लिए उपयोग करता है images2


कृपया अपने कमांड में अधिक विवरण जोड़ें ताकि यह भविष्य के पाठकों के लिए भी उपयोगी हो :)
रमेश

1

@ inulinux12, आप forकमांड लाइन से निम्नलिखित एक लाइन लूप का उपयोग कर सकते हैं :

$ for dir in images2/*; do mv "$dir"/* "${dir/2/}"; done

यह सभी फाइलों images2को imagesउनकी संबंधित निर्देशिका में स्थानांतरित कर देगा । नोट: यह मानता है कि किसी भी फाइल का एक ही नाम नहीं है।

उदाहरण के लिए:

निष्पादन से पहले:

$ ls -R images*
images:
ad  adfoo  fe
images/ad:
jpg.1  jpg.2
images/adfoo:
jpg.7
images/fe:
jpg.5
images2:
ad  adfoo  fe
images2/ad:
jpg.3
images2/adfoo:
jpg.6
images2/fe:
jpg.4

निष्पादन के बाद:

$ ls -R images*
images:
ad  adfoo  fe
images/ad:
jpg.1  jpg.2  jpg.3
images/adfoo:
jpg.6  jpg.7
images/fe:
jpg.4  jpg.5

3
के आउटपुट को पार्स न करें lsmywiki.wooledge.org/ParsingLs
Etan Reisner

@EtanReisner सुझाव के लिए धन्यवाद; हालांकि प्रश्न में दी गई जानकारी को देखते हुए सुंदर संकीर्ण परिदृश्य प्रतीत होते हैं।
बस_मे

2
@Simply_Me जबकि यह सच है कि यह आम तौर पर ठीक होगा, आप वास्तव में यह नहीं चाहते हैं कि जब आप किसी मामले में गिनती कर रहे थे तो आप उसे उड़ा दें। यह वास्तव में खराब समस्याएं पैदा कर सकता है। यह उल्लेख करने के लिए नहीं कि यह काफी (जैसा कि इस मामले में है) लगभग तुच्छ रूप से एक साधारण ग्लोब के साथ बदली है। मेरे उत्तर को उसी के उदाहरण के रूप में देखें।
इटन रिस्नर

@Simply_Me परिदृश्यों में रिक्त स्थान के साथ फ़ाइल नाम शामिल हैं, जो छवियों के लिए बहुत आम है।
गिल्स

@ गिल्स और @ ईटन रीजनर, इनपुट के लिए धन्यवाद, मैं इसकी सराहना करता हूं! स्ट्रिंग प्रतिस्थापन का उपयोग करने के लिए मेरे जवाब को अपडेट किया और परीक्षण किया, और यह basenameइस विशेष स्थिति में उपयोग करने की तुलना में तेज़ हो गया (इसके लिए कॉल करने की आवश्यकता नहीं है basename)। रचनात्मक टिप्पणियों के लिए फिर से धन्यवाद।
बस_मे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.