विभिन्न नाम के साथ एक नई निर्देशिका के लिए एक निर्देशिका rsync कैसे करें?


49

मैं एक डेटा ट्रांसफर कर रहा हूं, पुरानी फाइल सिस्टम एक निर्देशिका पर गहराई से निर्भर करता है जो अब अलग पथ पर है। यह एक git डायरेक्टरी है जो कोड को ऑनलाइन स्टोर करता है। मुझे इसे स्थानांतरित करने या नाम बदलने का कोई अधिकार नहीं है।

तो मैं क्या कर सकता है इस निर्देशिका को उसी पुराने पथ पर rsync करें। लेकिन डायरेक्टरी का नाम भी बदल गया।

वहाँ एक आसान तरीका है कि मैं एक निर्देशिका को एक अलग नाम के साथ एक लक्ष्य निर्देशिका में rsync कर सकता हूं?

जवाबों:


83

यदि आप निर्देशिका rsyncको destनिर्देशिका की सटीक प्रतिलिपि बनाने के लिए उपयोग करना चाहते हैं src:

rsync -a src/ dest

rsyncआदमी पृष्ठ बताता है कि यह कैसे काम करता है:

स्रोत पर एक अनुगामी स्लैश [...] गंतव्य पर एक अतिरिक्त निर्देशिका स्तर बनाने से बचें। आप /एक स्रोत पर एक अनुगामी के रूप में सोच सकते हैं जिसका अर्थ है "इस निर्देशिका की सामग्री को कॉपी करें" जैसा कि "नाम से निर्देशिका की प्रतिलिपि" के विपरीत है []]


3
यह एक बनाएगा srcतहत निर्देशिका destनिर्देशिका
ज़ेन

7
@Zen, rsyncमैंने कभी उपयोग किए गए किसी भी संस्करण में नहीं । यदि वास्तव में आपके साथ ऐसा हो रहा है, तो आप स्रोत निर्देशिका तर्क के अंत में पीछे चल रहे स्लैश को याद कर रहे हैं।
एड्रियन

3
उस डरपोक अनुगामी स्लेश प्रमुख है ...
तूतुका

दुर्भाग्य से यह काम करने के लिए नहीं लगता है अगर destयह एक सहानुभूति है src, तो इसके बजाय नकल srcकरना समाप्त होता है src/src। MacOS पर परीक्षण किया गया। उम्मीद थी कि मैं बदल सकते bar -> foo/के साथ bar/है, लेकिन एक मध्यवर्ती अस्थायी निर्देशिका का उपयोग करने के लिए किया था।
user5359531

@ user5359531 आप जानते हैं कि अगर destएक सिमलिंक है src, बस rm destउपरोक्त आदेश चलाने से पहले। की सामग्री को कॉपी करने से पहले rsyncबनाने के लिए पर्याप्त स्मार्ट है । आपको एक मध्यवर्ती अस्थायी डीआईआर की आवश्यकता नहीं है। destsrc
एड्रियन

1

यदि पुरानी और नई फाइलसिस्टम दोनों आपकी मशीन के लिए सुलभ हैं, तो rsync के बजाय एक प्रतीकात्मक लिंक का उपयोग करने पर विचार करें। यदि आपका rsync कमांड जो आप उपयोग कर रहे हैं, वह मेजबानों को निर्दिष्ट नहीं करता है (या यदि वे समान होस्ट हैं), तो यह मामला है। आप एक ही होस्ट पर एक अलग नाम के साथ दो निर्देशिकाओं को दर्पण करने की कोशिश कर रहे हैं। इसके लिए rsync का उपयोग न करें, चूंकि आप डेटा को डुप्लिकेट कर रहे हैं, और आपको उन्हें सिंक में रखने के लिए अपने rsync को अक्सर चलाना होगा।

एक प्रतीकात्मक लिंक का उपयोग करना एक बार तय करना है जो दो निर्देशिकाओं (विभिन्न नामों के साथ) को दर्पण करेगा और लगभग कोई स्थान नहीं चाहिए। यह एक उपनाम निर्देशिका बनाने जैसा है जो किसी अन्य निर्देशिका को इंगित करता है।

मान लीजिए कि आपके पास निर्देशिका / पुराना / पथ / पुराना_गित में पुराना git है और अब कोड रिपॉजिटरी / नया / पथ / new_git में स्थानांतरित हो गया है

तुम कर सकते हो:

cd /old/path
rm -rf old_git     (if you still have it there, get rid of it, or move it out of the way)  
ln -s /new/path/new_git old_git

यह इस प्रकार एक लिंक बनाएगा:

/ पुराना / पथ / पुराना_गित -> / नया / पथ / नया_गीत

ताकि new_git में डाली जाने वाली कोई भी चीज डेटा को दोहराए बिना और उन्हें लगातार सिंक किए बिना पुराने तरीके से तुरंत उपलब्ध हो जाए।


1
Rm -rf old_git कमांड से सावधान रहें। यह आपकी पूरी पुरानी_गीट रिपॉजिटरी को हटा देगा। अगर मैं आपकी समस्या को सही नहीं समझ रहा हूँ, तो यह एक बुरी बात हो सकती है।
jrel

0

मुझे अब एक वैकल्पिक समाधान मिल गया है।

उपयोग rysnc -r /origin/* /target/करने से मूल निर्देशिका से सभी सामग्री को लक्षित निर्देशिका में सिंक किया जा सकता है।


8
मेरा मानना ​​है कि इसमें डॉट (.foo) फाइलें शामिल नहीं हैं क्योंकि ये तारांकन के साथ मेल नहीं खाएंगे
रे बर्गेमेस्ट्रे

यह शेल ग्लोब विस्तार पर निर्भर करता है, तकनीकी रूप से यह rsync के तर्क के रूप में वहां मिली प्रत्येक फ़ाइल को पास करेगा। यह लगभग चलाने के समान है rsync -r $(find /origin -maxdepth 1 -type f) /target/ । जैसा कि @RayBurgemeestre ने बताया, शेल ग्लोब विस्तार में डॉट फाइलें शामिल नहीं होंगी।
फ्लोरियन कैस्टेलन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.