Rsync उस फ़ाइल की प्रतिलिपि बनाने का प्रयास क्यों करता है जो पहले से अद्यतित है?


24

मेरे पास दो समान फाइलें हैं, स्थानीय मशीन पर और रिमोट एक पर। उनके आकार बराबर हैं, और स्थानीय मशीन पर फ़ाइल दूरस्थ एक की तुलना में नई है - लेकिन rsync अभी भी फ़ाइल को कॉपी करने का प्रयास करता है।

मैं निम्नानुसार rsync आह्वान करता हूं:

rsync -nv -e "ssh -p 2222" user@host:/data/file.fif data/file.fif

(यदि मैं -nविकल्प का उपयोग नहीं करता हूं , तो यह कॉपी ऑपरेशन शुरू करता है)

रुपीक्स डॉक्स स्पष्ट रूप से बताता है कि ऐसा नहीं होना चाहिए:

Rsync  finds files that need to be transferred using a "quick check" algorithm (by default) that looks for files that have changed in size or in last-modified time.

से आउटपुट stat:

# remote file
  File: `data/fif/Skovorodko_Olga_45_raw.fif'
  Size: 1137551966  Blocks: 2221784    IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 286338      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1037/  platon)   Gid: ( 1047/  platon)
Access: 2013-08-08 18:40:16.907581658 +0400
Modify: 2013-07-16 12:01:09.158763284 +0400
Change: 2013-07-16 12:01:09.158763284 +0400

# local file
  File: `data/fif/Skovorodko_Olga_45_raw.fif'
  Size: 1137551966  Blocks: 2221792    IO Block: 4096   regular file
Device: 801h/2049d  Inode: 12987232    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1005/  platon)   Gid: ( 1003/  platon)
Access: 2013-08-08 19:02:57.146223369 +0400
Modify: 2013-08-08 19:02:57.146223369 +0400
Change: 2013-08-08 19:02:57.146223369 +0400

क्यों होता है ऐसा?

अद्यतन करें:

ऐसा करने से rsync --size-onlyपरिणाम कॉपी नहीं की जा रही फ़ाइल:

delta-transmission enabled
Skovorodko_Olga_45_raw.fif is uptodate
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 14 bytes  received 114 bytes  85.33 bytes/sec
total size is 1137551966  speedup is 8887124.73 (DRY RUN)

जवाबों:


37

त्वरित जांच एल्गोरिदम किसी भी फाइल को संशोधित करेगा, जिसमें विभिन्न संशोधन समय या अलग-अलग आकार होंगे। इसलिए, यदि आपके गंतव्य निर्देशिका में एक ही फ़ाइल का एक नया संस्करण है, तो इसे अलग माना जाएगा, और इसे स्रोत संस्करण में सिंक किया जाएगा।

यह अपेक्षित (और सुरक्षित) व्यवहार है। उदाहरण के लिए, मान लें कि आपके पास दो निर्देशिकाएं हैं, ~ / src और ~ / भाग्य, हर एक फोब्बर फ़ाइल के साथ। ~ / Src / foobar में आप "foo" लिखते हैं, और फिर ~ / dest / foobar में आप "बार" लिखते हैं। अब आप rsync ~ / src को ~ / dest दें। आप क्या उम्मीद करेंगे?

दोनों फाइलों का आकार समान है, लेकिन ~ / डिस्टार्ट में एक नया है। रुसी मानक व्यवहार को ~ / src / foobar के साथ ~ / dest / foobar को बदलना है। बेशक, फाइलें समान हो सकती हैं और यह अनावश्यक होगा, लेकिन यह जानने का कोई तरीका नहीं है, जब तक कि आप चेकसम नहीं करते हैं या प्रति बिट बिट की तुलना नहीं करते हैं।

यदि आप उस व्यवहार को नहीं चाहते हैं, तो यह कहना है कि आप चाहते हैं कि रिसीवर में नई फाइलें संरक्षित रहें, आपको -u (--update) ध्वज का उपयोग करना होगा।

-u, --update यह बल rsync को गंतव्य पर मौजूद किसी भी फाइल को छोड़ने के लिए और संशोधित समय है जो स्रोत फ़ाइल की तुलना में नया है। (यदि मौजूदा गंतव्य फ़ाइल में स्रोत फ़ाइल के बराबर एक संशोधन समय है, तो इसे अपडेट किया जाएगा यदि आकार अलग हैं।)


2
हाँ, यह वास्तव में समस्या थी। मैं -tध्वज जोड़ना भूल गया , इसलिए यह नई फ़ाइल पर उचित संशोधन का समय निर्धारित नहीं कर रहा था, और बाद में rsync चालान नई फ़ाइल को अपडेट करने का प्रयास कर रहे थे। धन्यवाद!
18

13
@Rogach हमेशा उपयोग करें rsync -aजब तक कि आपके पास एक अच्छा कारण न हो।
गिल्स एसओ- बुराई को रोकना '

मुझे ओपी की समान समस्या हो रही थी, लेकिन -aइस मामले में एक अलग समस्या पैदा होगी, अर्थात् एक त्रुटि skipping directory .इसका कारण है -aजिसमें -rमुझे लगता है कि अगर फ़ोल्डर में कोई निर्देशिका नहीं थी तो मुझे लगता है कि यह त्रुटि है। इस ब्लॉग पोस्ट
इलायची

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