फ़ाइलों को सिंक करने का सबसे अच्छा तरीका - केवल EXISTING फ़ाइलों की प्रतिलिपि बनाएँ और केवल तभी जब लक्ष्य से NEWER हो


18

मैं इस सिंक को Ubuntu 12.04 पर स्थानीय रूप से कर रहा हूं। फाइलें आम तौर पर छोटी पाठ फाइलें (कोड) होती हैं।

मैं sourceडायरेक्टरी से (माइम स्टैम्प को संरक्षित करना) targetकॉपी करना चाहता हूं, लेकिन मैं केवल यह कॉपी करना चाहता हूं कि क्या फाइल target पहले से मौजूद है और किसी एक से पुरानी है source

इसलिए मैं केवल उन फ़ाइलों की प्रतिलिपि बना रहा हूं जो नए हैं source, लेकिन उनमें मौजूद होना चाहिए targetया उनकी प्रतिलिपि नहीं बनाई जाएगी। ( sourceकी तुलना में कई अधिक फ़ाइलें होंगी target।)

मैं वास्तव में sourceकई targetनिर्देशिकाओं से कॉपी कर रहा हूँ । मैं इस मामले में इसका उल्लेख करता हूं कि यह समाधान की पसंद को प्रभावित करता है। हालाँकि, मैं आसानी से अपने कमांड को कई बार चला सकता हूं, targetहर बार नए को निर्दिष्ट करते हुए , यदि यह आवश्यक है।

जवाबों:


29

मुझे विश्वास है कि आप ऐसा करने के rsyncलिए उपयोग कर सकते हैं । कुंजी अवलोकन --existingऔर --updateस्विच का उपयोग करने की आवश्यकता होगी ।

        --existing              skip creating new files on receiver
        -u, --update            skip files that are newer on the receiver

इस तरह एक कमांड यह करेगी:

$ rsync -avz --update --existing src/ dst

उदाहरण

कहें कि हमारे पास निम्नलिखित नमूना डेटा हैं।

$ mkdir -p src/; touch src/file{1..3}
$ mkdir -p dst/; touch dst/file{2..3}
$ touch -d 20120101 src/file2

जो इस प्रकार है:

$ ls -l src/ dst/
dst/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3

src/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file1
-rw-rw-r--. 1 saml saml 0 Jan  1  2012 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3

अब अगर मैं इन निर्देशिकाओं को सिंक करता तो कुछ नहीं होता:

$ rsync -avz --update --existing src/ dst
sending incremental file list

sent 12 bytes  received 31 bytes  406.00 bytes/sec
total size is 0  speedup is 0.00

यदि हम touchएक स्रोत फ़ाइल बनाते हैं ताकि यह नया हो:

$ touch src/file3 
$ ls -l src/file3
-rw-rw-r--. 1 saml saml 0 Feb 27 01:04 src/file3

rsyncकमांड का एक और रन :

$ rsync -avz --update --existing src/ dst
sending incremental file list
file3

sent 115 bytes  received 31 bytes  292.00 bytes/sec
total size is 0  speedup is 0.00

हम देख सकते हैं कि file3, चूंकि यह नया है, और यह मौजूद है dst/, इसलिए यह भेजा जाता है।

परिक्षण

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

$ rsync -avvz --dry-run --update --existing src/ dst 
sending incremental file list
delta-transmission disabled for local transfer or --whole-file
file1
file2 is uptodate
file3 is newer
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 88 bytes  received 21 bytes  218.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

धन्यवाद। क्या मुझे कुछ और rsync विकल्पों की आवश्यकता नहीं है? मैं मैन पेज पढ़ रहा हूं। लगता है जैसे मुझे इसकी आवश्यकता हो सकती है rsync --archive --update --existing --whole-file --itemize-changes a/ b:। या उन विकल्पों में से अधिकांश अनावश्यक हैं? (मैंने पूरी फाइल जोड़ दी क्योंकि ये ज्यादातर छोटी पाठ फाइलें हैं।)
मोनिका सेलियो के लिए माउंटेनएक्स

@MountainX - केवल उन विकल्पों को जोड़ें जिनकी आपको आवश्यकता है। मैं -aस्विच के एक सुपरसेट के साथ शुरू करूँगा -rlptgoD
स्लम

मैं स्पष्ट कर दूं। मैं के बारे में उलझन में हूँ --updateऔर --existing। क्या मुझे दोनों की आवश्यकता है? मैंने आपके समाधान का परीक्षण किया और यह काम करने लगता है, लेकिन मैं अभी भी सुरक्षित महसूस कर रहा हूं --update
मोनिका सेलियो के लिए माउंटेनएक्स

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