Rsync द्वारा किसी एकल फ़ाइल का स्थानांतरण फिर से शुरू करें


52

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

मैंने विकल्प का उपयोग करने की कोशिश की है --partialया --inplace, लेकिन साथ में --progress, मैंने पिछली बार जो बचा था, उसके बजाय शुरुआत के rsyncसाथ --partialया --inplaceवास्तव में शुरू किया। मैन्युअल रूप से rsyncप्रारंभिक रोकना और प्राप्त फ़ाइल के आकार की जांच करना भी पुष्टि करता है कि मुझे क्या मिला।

लेकिन --append, पिछली बार जो बचा था उससे rsync शुरू होता है।

मैं के रूप में मैं पर देखा भ्रमित कर रहा हूँ आदमी पेज --partial , --inplaceऔर --appendक्या पिछली बार छोड़ दिया गया था से कॉपी करना शुरू करने से संबंधित प्रतीत। क्या कोई अंतर समझाने में सक्षम है? क्यों नहीं करते --partialया --inplaceनकल शुरू करने के लिए काम करता है? क्या यह सच है कि नकल को फिर से शुरू करने के लिए, विकल्प के rsyncसाथ काम करना होगा --append?

इसके अलावा, यदि कोई आंशिक फ़ाइल rsync द्वारा mvया cpउसके द्वारा नहीं छोड़ी गई थी, तो rsync --appendक्या फ़ाइल की प्रतिलिपि बनाना फिर से शुरू होगा ?

जवाबों:


39

एक बाधित कॉपी को फिर से शुरू करने के लिए, आपको उपयोग करना चाहिए rsync --append। मैन पेज की व्याख्या से --append:

यह फ़ाइल के अंत में डेटा को जोड़कर एक फ़ाइल को अपडेट करने के लिए rsync का कारण बनता है, जो यह मानता है कि जो डेटा पहले से ही प्राप्त पक्ष पर मौजूद है, वह भेजने वाले पक्ष पर फ़ाइल की शुरुआत के साथ समान है। [...] प्रत्यारोपण --inplace, [...]

विकल्प --inplaceबनाता है rsync(ओवर) गंतव्य फ़ाइल सामग्री को सीधे लिखें; बिना --inplace , rsyncहोगा:

  1. एक अस्थायी नाम के साथ एक नई फ़ाइल बनाएं,
  2. इसमें अपडेट की गई सामग्री की प्रतिलिपि बनाएँ,
  3. इसे गंतव्य फ़ाइल के साथ स्वैप करें, और अंत में
  4. गंतव्य फ़ाइल की पुरानी प्रति हटाएं।

ऑपरेशन का सामान्य मोड मुख्य रूप से उन अनुप्रयोगों के साथ टकराव को रोकता है जो गंतव्य फ़ाइल को खोल सकते हैं, और कुछ अन्य दुर्घटनाएं जो विधिवत रूप से rsyncमैनपेज में सूचीबद्ध हैं ।

ध्यान दें कि, यदि एक प्रतिलिपि / अद्यतन कार्रवाई चरण 3 में विफल रहती है। ऊपर, rsyncअस्थायी गंतव्य फ़ाइल को हटा देगा; --partial विकल्प इस व्यवहार अक्षम करता है और rsyncगंतव्य फाइल सिस्टम पर आंशिक रूप से स्थानांतरित कर अस्थायी फ़ाइलों को छोड़ देंगे। इस प्रकार, एक एकल फ़ाइल कॉपी ऑपरेशन को फिर से शुरू करने से तब तक बहुत लाभ नहीं होगा जब तक कि आप एक विशिष्ट निर्देशिका में सभी अस्थायी फ़ाइलों को बनाने के निर्देश के rsyncसाथ --partialया --partial-dir(एक ही प्रभाव के रूप --partialमें rsync) नहीं कहते हैं।


धन्यवाद! यदि आंशिक फ़ाइल mv या cp द्वारा rsync द्वारा नहीं छोड़ी गई थी, तो क्या rsync --append फ़ाइल प्रतिलिपि को फिर से शुरू करेगा?
टिम

1
@ संक्षेप में, --appendयह rsyncविश्वास दिलाता है कि, यदि दो संगत फ़ाइलों की लंबाई अलग-अलग है, तो छोटी एक लंबी अवधि के प्रारंभिक भाग के समान है। तो, हाँ, यदि आप एक बड़ी फ़ाइल की प्रतिलिपि बनाना शुरू करते हैं cpऔर प्रतिलिपि प्रक्रिया को बाधित करते हैं, तो rsync --appendफ़ाइल के केवल शेष भाग की नकल करेंगे। ( नोट: यदि cpसिस्टम क्रैश से बाधित होता है, तो एक छोटा सा मौका है कि फ़ाइल सामग्री और मेटाडेटा सिंक में नहीं हैं, अर्थात, फ़ाइल दूषित है। इस मामले में, समस्या को ठीक किए बिनाrsync एक बार और चल रहा है।) --append
रिकार्डो मुर्री

2
इसलिए यदि मैं इसे सही ढंग से समझता हूं, तो आंशिक फ़ाइल को सत्यापित करने और आंशिक रूप से स्थानांतरित फ़ाइल में स्थानांतरण फिर से शुरू करने के लिए rsync को बताने का कोई तरीका नहीं है ?
विनील

1
@Winny, बहुत ही संतुलित: एक स्थानीय प्रतिलिपि के लिए ऐसा करने का कोई समझदार तरीका नहीं है। एक नेटवर्क कॉपी के लिए यह डिफ़ॉल्ट मोड है जब आप --partialबिना निर्दिष्ट करते हैं --append
रोआमा

1
@ हनी --appendऔर --append-verifyएक खतरनाक विफलता मामला है: जब रिसीवर की फ़ाइल समान आकार या बड़ी होती है, लेकिन अलग-अलग डेटा होती है। मैं इसके बजाय आसपास आधारित समाधान--no-whole-file सुझाता हूं ।
टॉम हेल

21

ध्यान रहे कि --appendजिसका तात्पर्य --inplaceस्वयं से है --partial

  • बस का उपयोग करके --partialआप rsyncआंशिक स्थानान्तरण को छोड़ दें और बाद के प्रयासों में उन्हें फिर से शुरू करें।

  • उपयोग करने से --appendआपको rsyncआंशिक फ़ाइलों को छोड़ना चाहिए और अगली बार उन्हें फिर से शुरू करना चाहिए । स्थानांतरण के बाद rsyncकेवल प्रेषित डेटा के चेकसम को सत्यापित करना चाहिए।

  • --append-verify चेकसम सत्यापन में पूरी फ़ाइल शामिल है, जिसमें पिछले स्थानांतरण में स्थानांतरित कोई भी हिस्सा शामिल है।

  • --appendया तो --append-verifyएक असफल चेकसम सत्यापन के कारण फ़ाइल को पूरी तरह से पुन: प्रेषित किया जाना चाहिए (उपयोग करते हुए --inplace)

आप एक फिर से शुरू करने में सक्षम होना चाहिए mvया cpके साथ आपरेशन rsyncलेकिन आप उपयोग कर सकते हैं --append-verifyमन की शांति के लिए विकल्प।

ध्यान दें कि केवल उन्हीं फाइलों को कॉपी करने के --appendकारणों rsyncका उपयोग किया जा रहा है जिनके रिसीवर पर इसका आकार प्रेषक पर आकार से कम है (समय टिकटों की परवाह किए बिना), या रिसीवर पर अनुपस्थित हैं। इस विकल्प पर प्रलेखन द्वारा:

यदि किसी फ़ाइल को स्थानांतरित करने की आवश्यकता है और रिसीवर पर उसका आकार प्रेषक पर आकार से समान या अधिक लंबा है, तो फ़ाइल को छोड़ दिया जाता है।

मैन पेज में अधिक जानकारी


--appendऔर --append-verifyएक खतरनाक विफलता का मामला है: जब रिसीवर की फ़ाइल समान आकार या बड़ी होती है, लेकिन अलग-अलग डेटा होती है। मैं इसके बजाय आसपास आधारित समाधान--no-whole-file सुझाता हूं ।
टॉम हेल

@TomHale प्रलेखन से पता चलता है कि किसी फ़ाइल को छोड़ देने के लिए उसके दोनों सिरों पर बिल्कुल समान आकार और संशोधन का समय होना आवश्यक है। यदि यह एक प्रशंसनीय चिंता है तो --checksumइसका उपयोग किया जाना चाहिए। मैं इसे स्पष्ट रूप से निर्दिष्ट नहीं कर सकता, लेकिन तार्किक रूप से फिर से शुरू करने में सक्षम विकल्पों में से कोई भी होना चाहिए --no-whole-fileक्योंकि --whole-fileअसंगत होना चाहिए।
टॉम

--append-verifyअलग-अलग तिथियों के साथ समान या बड़े आकार की फ़ाइलों को छोड़ देगा , जो "अनपेक्षित" हो सकती है। --checksum सभी फ़ाइलों की कोई आवश्यकता नहीं है , जैसा rsyncकि वैसे भी एक पूरी फ़ाइल चेकसम करेगा, लेकिन केवल उसी पर जो इसे स्थानांतरित करता है।
टॉम हेल

--checksumrsyncफ़ाइलों को भेजने से पहले चेकसम को बताता है जो यह सुनिश्चित करता है कि सभी परिवर्तित फ़ाइलों को आकार / समय की परवाह किए बिना स्थानांतरित किया जाए। क्या आपको अप्रत्याशित --append-verifyव्यवहार के लिए एक स्रोत मिला है जैसा कि आप वर्णन करते हैं कि यह दस्तावेज़ या मेरे (सीमित) अनुभव के साथ मेल नहीं खाता है?
टॉमजी

--append-verifyयह संदर्भित करता है --appendकि: If a file needs to be transferred and its size on the receiver is the same or longer than the size on the sender, the file is skipped.भले ही किसी फ़ाइल को स्थानांतरित करने की आवश्यकता हो --checksum, फिर भी इसे छोड़ दिया जा सकता है।
टॉम हेल

6

डेविड श्वार्ट्ज सही है, --partial(या बेहतर -P) वह करता है जो आप चाहते हैं। मैंने इसे एक 37G फ़ाइल पर सत्यापित किया था जिसे ~ 8g में बंद कर दिया गया था, एक नेटवर्क पर। rsync ने आंशिक रूप से भाग के पहले भागों को स्कैन किया (प्रगति को धन्यवाद के रूप में दिखा रहा था -P), और फिर आंशिक फ़ाइल के अंत में स्थानांतरण को फिर से शुरू किया।


एक नेटवर्क कॉपी को एक स्थानीय कॉपी के साथ अलग तरीके से व्यवहार किया जाता है, जो यहां मुद्दा है।
रोमिमा

@roaima क्या आपके पास इसके लिए एक स्रोत है, या एक दस्तावेज़ है जो अधिक विस्तार से बताता है कि अंतर क्या हैं? मैं इसे (विशाल) मेनपेज में खोजने में असफल रहा।
जोनास Schäfer

@JonasWielicki आदमी पृष्ठ --whole-fileविकल्प विवरण के तहत इसे आवंटित करता है ।
रोएमा

@roaima बहुत बहुत धन्यवाद! इसका यह भी अर्थ है कि उचित समाधान है --no-W(जो वास्तव में काम करता है!)
जोनास स्चफर

@JonasWielicki यह अत्यधिक अक्षम है, यही वजह है कि यह डिफ़ॉल्ट रूप से अक्षम है। आप वास्तव में --no-Wतब तक उपयोग नहीं करना चाहते जब तक कि आप यह न समझ लें कि स्थानीय फ़ाइलों के लिए इसका क्या अर्थ है। देखें unix.stackexchange.com/a/181018/100397
roaima

2

आप इसे ठीक कर रहे थे --partialजो आप चाहते हैं। यह शुरुआत से शुरू होता है क्योंकि यह हमेशा फ़ाइल डेटा की सूची की शुरुआत में शुरू होता है जो इसे कॉपी करने की आवश्यकता है। --appendविकल्प खतरनाक है और एक भ्रष्ट फ़ाइल में परिणाम अगर डेटा किसी कारण से मेल नहीं खाता होगा।


स्थानीय प्रतियों की तुलना नहीं की जाती है, वे बस अधिलेखित हैं (या --appendबाइट ऑफसेट से जारी है)।
रोइमा

1

डिफ़ॉल्ट रूप से, स्थानीय डिस्क से स्थानीय डिस्क पर स्थानांतरित rsyncकरने में सक्षम करेगा --whole-file। यह शुरू से ही एक बाधित हस्तांतरण को फिर से शुरू करेगा, बजाय कि पहले से मौजूद भागों की जाँच के।

इसे अक्षम करने के लिए, उपयोग करें:

--no-whole-file

--inplaceया तो इसके साथ संयोजन करने या --partialबाद में स्थानांतरण को फिर से शुरू करने की अनुमति देगा।

rsyncप्रतिलिपि का उपयोग करने के लिए मेरा उपनाम है:

rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'

चेतावनी : इसका उपयोग करने से सावधान रहें --append-verifyक्योंकि यह किसी भी गंतव्य फ़ाइलों को छोड़ देगा जो समान आकार या बड़े हैं।


नेटवर्क ट्रांसफर के rsyncलिए केवल उन हिस्सों को भेजने के लिए स्थानांतरण से पहले स्रोत और इसी गंतव्य फ़ाइलों की तुलना करता है जो बदल गए हैं (डेल्टा-ट्रांसफर)। स्थानीय-से-स्थानीय प्रतिलिपि के लिए एक ही काम करने के लिए --no-whole-fileकहता rsyncहै। प्रलेखन का सुझाव नहीं है कि यह एकल फ़ाइलों के आंशिक स्थानान्तरण को फिर से शुरू करने पर कोई प्रभाव पड़ेगा। rsyncडिज़ाइन द्वारा बिल्कुल समान आकार और टाइमस्टैम्प वाली फ़ाइलों को छोड़ देगा। न तो --append-verifyहै और न ही --no-whole-fileउस व्यवहार बदलना चाहिए लेकिन --checksumसाथ काम करना चाहिए या तो डिस्क आईओ की कीमत पर मन की शांति के लिए
TomG

--append-verifyअलग-अलग तिथियों के साथ समान या बड़े आकार की फ़ाइलों को छोड़ देगा , जो "अनपेक्षित" हो सकती है। --checksum सभी फ़ाइलों की कोई आवश्यकता नहीं है , जैसा rsyncकि वैसे भी एक पूरी फ़ाइल चेकसम करेगा, लेकिन केवल उसी पर जो इसे स्थानांतरित करता है।
टॉम हेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.