मैं डायरेक्टरी ट्री की नकल करने के लिए rsync का उपयोग कैसे कर सकता हूं, फाइलों में हार्डलिंक बना रहा हूं?


23

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

हालाँकि, मैं ऐसा करने के लिए rsync प्राप्त नहीं कर सकता। मैंने कोशिश की

rsync -a --link-dest=$DATA $DATA $DATA/../upgrade_tmp

लेकिन फ़ाइलों के लिए कड़ी बनाने के बजाय, rsync उन्हें पूरी तरह से कॉपी करता है। क्या एक ही स्रोत और लिंक-डिस्ट निर्देशिका का उपयोग करने में कोई समस्या है?

जवाबों:


21

rsync एक शक्तिशाली उपकरण है, लेकिन यह दुर्भाग्य से, अजीब तरीके से इसके कुछ पाथने के बारे में है।

यदि $DATAएक निरपेक्ष पथ है (अर्थात इसके साथ शुरू होता है /), तो उपयोग करने के लिए सही कमांड-लाइन है:

rsync -a --link-dest=$DATA $DATA/ $DATA/../upgrade_tmp

[अब, बस एक तरफ एक rsyncअजीब अजनबी के बारे में । /स्रोत तर्क में जोड़े गए अनुगामी नोट करें । यह स्रोत निर्देशिका rsyncकी सामग्री के साथ काम करना बताता है , बजाय स्रोत निर्देशिका के साथ ही। (मुझे लगता है कि $DATAपहले से ही एक अनुगामी शामिल नहीं है /।) इस मामले में, हम सामग्री के साथ काम करना चाहते हैं, इसलिए हम अनुगामी जोड़ते हैं /।]

यदि, दूसरी ओर, $DATAएक सापेक्ष पथ है (अर्थात यह /उसके साथ शुरू नहीं होता है ), तो शॉन आर की टिप्पणी के बारे --link-destमें धमाका है: लिंक-डेस्ट पथ गंतव्य पथ के सापेक्ष व्याख्या की गई है , इसलिए आप निम्नलिखित का उपयोग करेंगे:

rsync -a --link-dest=../`basename $DATA` $DATA/ $DATA/../upgrade_tmp

संपादित करें

एक अंतिम ध्यान दें, यह पता चलता है कि rsyncमैंने जो दूसरी कमांड-लाइन दी है, उसे बिना किसी परवाह के काम करना चाहिए $DATA, क्योंकि basenameकोई रास्ता नहीं है या कोई रास्ता नहीं है।


1
बस एक लापता स्लैश, जिसने सोचा होगा कि ... अच्छी व्याख्या के लिए धन्यवाद!
जीन-फिलिप पेलेट

इसके लिए धन्यवाद, मैंने इस तरह के कई वृद्धिशील बैकअप निर्देशों का पालन करने की कोशिश की, और इस quirk का कोई उल्लेख नहीं किया। यह केवल एक चीज थी जो वास्तव में सुनिश्चित की गई फ़ाइलों को हार्डलिंक किया जा रहा था। जाँच कर रहा था कि रेफ काउंट> 1 था और ls -ilah
इनोड

मैंने इसे इस तरह एक निर्देशिका में बैकअप करने के लिए unix.stackexchange.com/a/85068/57414 पर दिए गए relpath () फ़ंक्शन के साथ संयोजन में उपयोग किया :$SOURCE$TARGETSOURCE='abs_path_to_backup'; TARGET='.'; rsync -a --link-dest=$(relpath $TARGET $SOURCE) $SOURCE/ $TARGET/
नाथन एस। वाटसन-हाई

13

आप क्या चाहते हैं "cp -al":

cp -al $DATA/ $DATA/../upgrade_tmp/
  • -ए पुनरावृत्ति की तरह rsync -a
  • -l हार्ड कॉपी फाइलों को कॉपी करने के बजाय उन्हें लिंक करेगा।

1
cp -alदुर्भाग्य से मेरे सिस्टम पर उपलब्ध नहीं है (मैक ओएस एक्स 10.6)। मैं इसके बजाय पैक्स का उपयोग करूँगा ...
जीन-फिलिप पेलेट

7

इसमें --link-destविकल्प गंतव्य निर्देशिका के rsyncसापेक्ष है , वर्तमान निर्देशिका के लिए नहीं। तो आप क्या चाहते हैं:

rsync -a --link-dest=../`basename $DATA` $DATA $DATA/../upgrade_tmp

उफ़, मेरा मतलब था बेसन, मूल रूप से मैं dirname था।
सीन रिफ़्शिनडर

1
मैन पेज कहता है कि --link-destविकल्प, यदि सापेक्ष है , तो लक्ष्य निर्देशिका के सापेक्ष है। मेरे मामले में यह निरपेक्ष है। यहां तक ​​कि इसे लक्ष्य निर्देशिका के सापेक्ष बनाने से भी यह काम नहीं होता है।
जीन-फिलिप पेलेट

7

rsyncअन्य उपकरणों की तुलना में ऐसा करना अधिक कठिन है । rsyncस्टीवन मोनाई का सही उत्तर है, लेकिन ऐसा करने का सबसे आसान तरीका उन प्रणालियों पर cp -alया तो उपयोग करना है pax -rwlजहां -lकोई वैध विकल्प नहीं है cp:

pax -rwl $DATA $DATA/../upgrade_tmp

या

cp -al $DATA/ $DATA/../upgrade_tmp/

4

इससे मेरा काम बनता है:

$ rsync --hard-links --recursive --link-dest=/local user@host:/remote/ /local

मैं 3.1.0 संस्करण rsync का उपयोग करता हूं।

से आदमी :

--hard-लिंक

ट्रांसफ़र में हार्ड-लिंक्ड फ़ाइल्स की तलाश के लिए rsync को बताता है, इस ऑप्शन के बिना, ट्रांसफ़र में हार्ड-लिंक्ड फ़ाइल्स को अलग-अलग फ़ाइलों के रूप में माना जाता है।

--link-dest = DIR

अपरिवर्तित फ़ाइलें DIR से गंतव्य निर्देशिका से जुड़ी हुई हैं। फ़ाइलों को एक साथ जोड़ने के लिए सभी संरक्षित विशेषताओं (जैसे अनुमतियाँ, संभवतः स्वामित्व) में फ़ाइलें समान होनी चाहिए


2
केवल कोड स्निपेट पर्याप्त नहीं है, यह बताएं कि यह क्या और क्यों करता है।
पीटर कहते हैं मोनिका

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

1
आश्चर्यजनक। धन्यवाद। दरअसल, मुझे आपका जवाब "कम गुणवत्ता" वाली कतार में मिला। इसका मतलब है, एक वोट था यदि आपका उत्तर हटा दिया जाना चाहिए या नहीं। लेकिन न केवल विलोपन का खतरा एक अच्छी तरह से स्वरूपित, "मानव" उत्तर देने की कोशिश करने का एक कारण है, लेकिन यह भी बहुत मदद करता है यदि आप एक अपवोट इकट्ठा करना चाहते हैं।
पीटर का कहना है कि मोनिका

2

लिंक का पालन कोशिश कर सकते हैं http://www.lessfs.com/wordpress/ उस पर काम है गाय (लिखने पर प्रतिलिपि) कि समय और स्थान की बचत होगी


पट्टियाँ बहुत दिलचस्प है, लेकिन यह भी बहुत प्रयोगात्मक है। अभी उत्पादन के उपयोग के लिए अनुशंसित नहीं है।
15

2

पहले केवल गंतव्य पर निर्देशिका बनाएं:

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

फिर हार्ड फ़ाइलों को केवल लिंक करें:

cd /source
find . -type f -exec ln -v {} /destination/{} \;

धन्यवाद - वास्तव में, मैं paxअपनी टिप्पणी में ऊपर बताए अनुसार उपयोग कर सकता हूं, जो आसान लगता है।
जीन-फिलिप पेलेट

1

हार्डलिंक को संरक्षित करने और मैनपेज को पढ़ने के लिए विकल्प -H का उपयोग करें।


1
-H काम नहीं करता। मेरे स्रोत वृक्ष में संरक्षित करने के लिए मेरे पास कोई हार्डलिंक नहीं है, मुझे बस अपने स्रोत पेड़ की एक सरल प्रतिलिपि चाहिए जहां प्रतिलिपि में, सभी फाइलें मूल फ़ाइलों के लिए हार्डलिंक की गई हैं। मेरे मूल प्रश्न में खेद स्पष्ट नहीं था ...
जीन-फिलिप पेलेट

क्या "पेज पढ़ें" एक उत्तर है? :-)
मेडुज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.