rsync: के बीच अंतर --साइज़-ओनली और --ignore-times


114

मैं यह समझने की कोशिश कर रहा हूं कि दो विकल्पों में क्या अंतर है

rsync --size-only

तथा

rsync --ignore-times

यह मेरी समझ है कि डिफ़ॉल्ट रूप से rsync दोनों टाइमस्टैम्प और फ़ाइल आकारों की तुलना करेंगे ताकि यह तय किया जा सके कि फ़ाइल को सिंक्रनाइज़ किया जाना चाहिए या नहीं। उपरोक्त विकल्प उपयोगकर्ता को इस व्यवहार को प्रभावित करने की अनुमति देते हैं।

दोनों विकल्प प्रतीत होते हैं, कम से कम मौखिक रूप से एक ही चीज के परिणामस्वरूप: केवल आकार से तुलना करना

क्या मुझे यहाँ कुछ याद आ रहा है?


18
यह शायद SuperUser.com या Unix.SE जैसी किसी चीज़ पर बेहतर रूप से फिट होगा , क्योंकि यह सीधे लेखन कोड से संबंधित किसी चीज़ के बजाय एक मौजूदा (गैर-प्रोग्रामिंग संबंधित) टूल का उपयोग करने के बारे में है।
जेरी कॉफिन

जवाबों:


110

फ़ाइलों की तुलना करने के कई तरीके हैं rsync - आधिकारिक स्रोत rsync एल्गोरिथम विवरण है: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridg396 .pdf । विकिपीडिया लेख rsync पर भी बहुत अच्छा है।

स्थानीय फ़ाइलों के लिए, rsync मेटाडाटा की तुलना करता है और यदि ऐसा लगता है कि इसे फ़ाइल को कॉपी करने की आवश्यकता नहीं है क्योंकि स्रोत और गंतव्य के बीच आकार और टाइमस्टैम्प मेल से आगे नहीं दिखता है। यदि वे मेल नहीं खाते हैं, तो यह cp की फाइल है। हालाँकि, अगर मेटाडेटा मैच करता है, लेकिन फ़ाइलें वास्तव में समान नहीं हैं? तब rsync ने शायद वह नहीं किया जो आप करना चाहते थे।

समान आकार वाली फ़ाइलें अभी भी परिवर्तित हो सकती हैं। एक सरल उदाहरण एक पाठ फ़ाइल है जहाँ आप एक टाइपो को ठीक करते हैं - जैसे "तेह" को "द" में बदलना। फ़ाइल का आकार समान है, लेकिन सही फ़ाइल में एक नया टाइमस्टैम्प होगा। --size-onlyकहते हैं, "समय पर मत देखो; अगर आकार मैच फाइलों के मेल से मेल खाता है", जो इस मामले में गलत विकल्प होगा।

दूसरी ओर, मान लीजिए कि आपने गलती से एक बड़ा cp -r A Bकल कर लिया था, लेकिन आप समय टिकटों को संरक्षित करना भूल गए, और अब आप रिवर्स में ऑपरेशन करना चाहते हैं rsync B A। उन सभी फ़ाइलों को जिन्हें आपने cp'ed किया है, कल का समय स्टाम्प है, भले ही वे वास्तव में कल संशोधित नहीं हुए थे, और rsync डिफ़ॉल्ट रूप से उन सभी फ़ाइलों की प्रतिलिपि बना लेगा, और टाइमस्टैम्प को कल भी अपडेट कर देगा। --size-onlyइस मामले में आपका मित्र हो सकता है (ऊपर दिए गए उदाहरण को मापता है)।

--ignore-timesफ़ाइलों की तुलना करने के लिए कहते हैं, भले ही फ़ाइलों में एक ही समय संशोधित हो। ऊपर दिए गए टाइपो उदाहरण पर विचार करें, लेकिन तब न केवल आपने टाइपो को ठीक किया था, बल्कि आपने touchसही फ़ाइल बनाने के लिए मूल फ़ाइल के समान ही संशोधित समय दिया था - मान लें कि आप इस तरह से डरपोक हैं। आकार और समय के मेल के बावजूद , --ignore-timesफ़ाइलों का एक अच्छा हिस्सा होगा ।


58

संक्षिप्त उत्तर यह है कि --ignore-timesइसके नाम का अर्थ अधिक है। यह समय और आकार दोनों की अनदेखी करता है । इसके विपरीत, --size-onlyजैसा कहता है वैसा ही करता है।


लंबा जवाब यह है कि rsyncअगर फ़ाइल पुरानी है, तो यह तय करने के तीन तरीके हैं:

  1. स्रोत और गंतव्य के आकार की तुलना करें।
  2. स्रोत और गंतव्य के टाइमस्टैम्प की तुलना करें।
  3. स्रोत और गंतव्य के स्थिर चेकसम की तुलना करें।

ये जांच डेटा ट्रांसफर करने से पहले की जाती है। उल्लेखनीय रूप से, इसका मतलब है कि स्टैटिक चेकसम स्ट्रीम चेकसम से अलग है - डेटा ट्रांसफर करते समय बाद में गणना की जाती है।

डिफ़ॉल्ट रूप से, rsyncकेवल 1 और 2 का उपयोग करता है। 1 और 2 दोनों को एक साथ प्राप्त किया जा सकता है stat, जबकि 3 को पूरी फ़ाइल पढ़ने की आवश्यकता होती है (यह स्थानांतरण के लिए फ़ाइल पढ़ने से स्वतंत्र है)। केवल एक संशोधक निर्दिष्ट है, इसका मतलब है कि निम्नलिखित:

  • उपयोग करके --size-only, केवल 1 का प्रदर्शन किया जाता है - टाइमस्टैम्प और चेकसम को अनदेखा किया जाता है। किसी फ़ाइल की प्रतिलिपि तब तक बनाई जाती है जब तक उसका आकार दोनों सिरों पर समान न हो।

  • का उपयोग करके --ignore-times, न तो 1, 2 या 3 का प्रदर्शन किया जाता है। एक फ़ाइल हमेशा कॉपी की जाती है।

  • उपयोग करके --checksum, 1 के अतिरिक्त 3 का उपयोग किया जाता है , लेकिन 2 का प्रदर्शन नहीं किया जाता है। जब तक आकार और चेकसम का मिलान नहीं होता तब तक एक फाइल कॉपी की जाती है। यदि आकार मेल खाता है तो चेकसम की गणना केवल की जाती है।


1
-चेकसम वास्तव में वही है जिसकी मुझे तलाश थी। मैं बिल्ड आउटपुट की प्रतिलिपि बना रहा था जिसमें केवल अधिकांश फ़ाइलों के लिए समय परिवर्तन था। --Checksum को जोड़ने का मतलब है कि इसने समय के अंतर को नजरअंदाज कर दिया लेकिन सुनिश्चित किया कि वे बिट के लिए समान थे। यह वही था जिसकी मुझे अपेक्षा थी - अतिरिक्त समय के लिए धन्यवाद।
जोसेफ कोनोली

50

आप याद कर रहे हैं कि rsync चेकसम द्वारा फाइलों की तुलना भी कर सकता है।

--size-onlyइसका मतलब है कि rsync फ़ाइलों को आकार में मेल खाता है, भले ही टाइमस्टैम्प अलग हो। इसका मतलब है कि यह डिफ़ॉल्ट व्यवहार की तुलना में कम फ़ाइलों को सिंक्रनाइज़ करेगा। यह किसी भी फ़ाइल को उन परिवर्तनों से याद करेगा जो समग्र फ़ाइल आकार को प्रभावित नहीं करते हैं। यदि आपके पास कुछ ऐसा है जो फ़ाइलों को बदलने के बिना फ़ाइलों पर तारीखों को बदलता है, और आप नहीं चाहते कि rsync बहुत समय बिताए, तो उन फ़ाइलों की जांच करने के लिए कि वे बदल नहीं गए हैं, यह उपयोग करने का विकल्प है।

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


4
"तिथि / समय को रीसेट करना व्यवहार में होने की संभावना नहीं है, लेकिन ऐसा हो सकता है" - उदाहरण के लिए, सॉफ्टवेयर का उपयोग करते समय, जो प्रतिलिपि प्रस्तुत करने योग्य बिल्ड के नाम पर, हर फ़ाइल को दिनांक के बजाय 1970-01-01 तक जबरन रीसेट करता है; वास्तविक निर्माण / संशोधन का समय।

10
वास्तव में, मुझे लगता है कि यदि आप चेकसम का उपयोग करना चाहते हैं तो आपको -c विकल्प की आवश्यकता है। इसके बिना, --ignore-time सभी फ़ाइलों को बिना शर्त कॉपी करेगा।
एडवर्ड फॉक

1
-A विकल्प इन विकल्पों को ओवरराइड कर सकता है। मेरे मामले में मैं --compare-dir = और --साइज-ओनली का उपयोग कर रहा था और अप्रत्याशित परिणाम प्राप्त कर रहा था। -A -r बदलने से समस्या हल हो गई।
22

@dbagnara मैंने आज इस बात की पुष्टि की है कि --साइज़-ओनली "" -ए के ऊपर बैठता है, या "ओवरराइड्स" -ए। मेरे पास एक ड्राइव थी जो किसी भी कारण से सभी संशोधन के साथ एक महीने तक बढ़ गई। बैकअप के लिए रुपीस हर फाइल (-a ON) की नकल कर रहा था। जोड़ना - आकार-केवल समस्या को ठीक किया और वांछित परिणाम (ताकि -ए -साइज़-ओनली) के लिए नेतृत्व किया। इसलिए मैं यह निष्कर्ष निकालता हूं कि केवल-संग्रह ही ओवरराइड करता है।
टॉमी

1

एक वैज्ञानिक लिनक्स 6.7 सिस्टम पर, rsync का मैन पेज कहता है:

--ignore-times          don't skip files that match size and time

मेरे पास समान सामग्री के साथ दो फाइलें हैं, लेकिन विभिन्न निर्माण तिथियों के साथ:

[root@windstorm ~]# ls -ls /tmp/master/usercron /tmp/new/usercron
4 -rwxrwx--- 1 root root 1595 Feb 15 03:45 /tmp/master/usercron
4 -rwxrwx--- 1 root root 1595 Feb 16 04:52 /tmp/new/usercron

[root@windstorm ~]# diff /tmp/master/usercron /tmp/new/usercron
[root@windstorm ~]# md5sum /tmp/master/usercron /tmp/new/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/master/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/new/usercron

इसके साथ --size-only, दो फ़ाइलों को समान माना जाता है:

[root@windstorm ~]# rsync -v --size-only -n  /tmp/new/usercron /tmp/master/usercron

sent 29 bytes  received 12 bytes  82.00 bytes/sec
total size is 1595  speedup is 38.90 (DRY RUN)

के साथ --ignore-times, दो फ़ाइलों को अलग माना जाता है:

[root@windstorm ~]# rsync -v --ignore-times -n  /tmp/new/usercron /tmp/master/usercron
usercron

sent 32 bytes  received 15 bytes  94.00 bytes/sec
total size is 1595  speedup is 33.94 (DRY RUN)

इसलिए ऐसा नहीं लगता है कि --ignore-timesइसका कोई प्रभाव है।


2
--ignore-timesभले ही उनके टाइमस्टैम्प समान हों, उन्होंने फाइलों की नकल की होगी।
मिस्टरमियागी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.