कमांड लाइन टूल के साथ दो फ़ोल्डरों को कैसे सिंक करें?


63

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

हमारे पास दो फ़ोल्डर हैं: "/ होम / यूजर / ए" और "/ होम / यूजर / बी"

Folder A वह स्थान है जहाँ नियमित फ़ाइलें और फ़ोल्डर सहेजे जाते हैं और फ़ोल्डर B एक बैकअप फ़ोल्डर है जो फ़ोल्डर A के पूर्ण दर्पण के रूप में कार्य करता है (फ़ोल्डर B में उपयोगकर्ता द्वारा कुछ भी सीधे सहेजा या संशोधित नहीं किया जाता है)

मेरे प्रश्न हैं:

  • फ़ाइलों की सूची कैसे दें जो केवल फ़ोल्डर B में मौजूद हैं? (पिछले सिंक्रनाइज़ेशन के बाद से फ़ोल्डर ए से हटाए गए।)

  • केवल फ़ोल्डर B में मौजूद फ़ाइलों को फ़ोल्डर A में वापस कॉपी कैसे करें?

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

  • फ़ोल्डर B में फ़ोल्डर A की सटीक प्रतिलिपि कैसे बनाएं? मेरा मतलब है कि फ़ोल्डर ए से फ़ोल्डर बी में सब कुछ कॉपी करें जो केवल फ़ोल्डर ए में मौजूद है और फ़ोल्डर बी से सब कुछ हटा दें जो केवल फ़ोल्डर बी में मौजूद है, लेकिन उन फ़ाइलों को छूने के बिना जो दोनों फ़ोल्डरों में समान हैं।


इसके लिए एक उचित बैकअप प्रोग्राम का उपयोग क्यों न करें? द्वैधता इसका एक उदाहरण है।
कुदित

जवाबों:


88

यह फ़ोल्डर A को फ़ोल्डर B में डालता है:

rsync -avu --delete "/home/user/A" "/home/user/B"  

यदि आप चाहते हैं कि फ़ोल्डर A और B की सामग्री समान हो, /home/user/A/तो स्रोत के रूप में (स्लैश के साथ) डाल दें । यह फ़ोल्डर ए नहीं लेता है, लेकिन यह सभी सामग्री है और इसे फ़ोल्डर बी में रखता है। इस तरह:

rsync -avu --delete "/home/user/A/" "/home/user/B"
  • -a सभी फाइलसिस्टम विशेषताओं को संरक्षित करते हुए सिंक करें
  • -v मौखिक रूप से चलाएं
  • -u केवल एक नए संशोधन समय के साथ फ़ाइलों की प्रतिलिपि बनाएँ (या यदि समय बराबर हो तो आकार अंतर)
  • --delete स्रोत में मौजूद नहीं है लक्ष्य फ़ोल्डर में फ़ाइलों को हटा दें

Manpage: https://download.samba.org/pub/rsync/rsync.html


7
rsync : रन rsync ऐप; -ए : सभी फाइलसिस्टम विशेषताओं को संरक्षित करने वाला सिंक करें, -v : वर्बोसली रन करें, -z : सिंक के दौरान डेटा को संपीड़ित करें (डेटा को संपीड़ित मोड में परिवहन करें), --delete : लक्ष्य में फ़ाइलों को हटाएं फ़ोल्डर जो स्रोत में मौजूद नहीं है, / home / user / A : स्रोत फ़ोल्डर, / घर / उपयोगकर्ता / B : लक्ष्य फ़ोल्डर
SonicARG

हाय SonicARG, मैं पूरी तरह से इस पर वापस जाना और स्पष्टीकरण डाल भूल गया, धन्यवाद स्पष्टीकरण प्रस्तुत करते हुए, मैंने तुम्हारा जवाब दिया, आशा है कि तुम बुरा मत मानना।
TuxForLife

6
रुपीक्स प्राइमरली विभिन्न कंप्यूटरों के बीच फाइलों को कॉपी करने के लिए होता है, जैसा कि यहां बताया गया है कि यह निर्देशिकाओं को सिंक करने के उद्देश्य को पूरा कर सकता है। तो -z विकल्प नेटवर्क ट्रैफिक को कम करने के लिए दिलचस्प है और इस तरह 2 कंप्यूटरों के बीच rsync का प्रदर्शन बढ़ाता है: (डिस्क से डेटा पढ़ें -> संपीड़ित) === नेटवर्क ===> (अनकंप्रेस-> डिस्क पर लिखें) का उपयोग करना - z एक ही मेजबान पर 2 निर्देशिकाओं को सिंक करने के लिए है और आपको जो कुछ भी
साइप

@GerritCap, मैंने एक संपादन किया, आपके बहुमूल्य इनपुट के लिए धन्यवाद
TuxForLife

1
मैंने कमांड की कोशिश की है, लेकिन यह /home/user/B/Aए की सामग्री को बी की सामग्री को अधिलेखित करने के बजाय एक उप-डायर बनाता है। क्या आप मुझे इस पर एक नज़र डालने में मदद कर सकते हैं?
ल्यूक

10

आप unisonयू पेन में बेंजामिन पियर्स द्वारा विकसित टूल कर सकते हैं ।

मान लें कि आपके पास दो निर्देशिकाएं हैं,

/home/user/Documents/dirA/ तथा /home/user/Documents/dirB/

इन दोनों को समकालित करने के लिए, आप उपयोग कर सकते हैं:

~ $unison -ui text /home/user/Documents/dirA/ /home/user/Documents/dirB/

आउटपुट में, unisonप्रत्येक निर्देशिका को और फ़ाइल को प्रदर्शित करेगा जो आपके द्वारा सिंक करने के लिए कहे गए दो निर्देशिकाओं में भिन्न है। यह प्रारंभिक रन पर additively सिंक्रोनाइज़ (दोनों स्थानों में गुम फाइल को दोहराने) की सिफारिश करेगा, फिर अपनी मशीन पर एक सिंक्रोनाइज़ेशन ट्री बनाएगा और बनाए रखेगा, और बाद के रनों पर यह सही सिंक्रोनाइज़ेशन को लागू करेगा (अर्थात, यदि आप किसी फ़ाइल को इससे हटाते हैं .../dirA, तो के .../dirBरूप में अच्छी तरह से हटा दिया जाएगा । आप भी प्रत्येक परिवर्तन की तुलना कर सकते हैं और वैकल्पिक रूप से दो निर्देशिकाओं के बीच आगे या रिवर्स सिंक्रनाइज़ करने के लिए चुन सकते हैं

वैकल्पिक रूप से, ग्राफ़िकल इंटरफ़ेस लॉन्च करने के लिए, बस -ui textअपने कमांड से विकल्प को हटा दें , हालाँकि मुझे उपयोग करने में cliसरल और तेज़ लगता है ।

इस पर और अधिक: यूनिसन उपयोगकर्ता दस्तावेज़ में यूनीसन ट्यूटोरियल


1

TuxForLife का उत्तर बहुत अच्छा है, लेकिन मैं आपको -cस्थानीय स्तर पर समन्वयित करने पर दृढ़ता से सुझाव देता हूं । आप तर्क दे सकते हैं कि यह रिमोट सिंक के लिए करने के लिए समय / नेटवर्क जुर्माना के लायक नहीं है, लेकिन यह स्थानीय फ़ाइलों के लिए पूरी तरह से इसके लायक है क्योंकि गति इतनी महान है।

-c, --checksum
       This forces the sender to checksum every regular file using a 128-bit  MD4
       checksum.   It  does this during the initial file-system scan as it builds
       the list of all available files. The receiver then checksums  its  version
       of  each  file  (if  it exists and it has the same size as its sender-side
       counterpart) in order to decide which files need to be updated: files with
       either  a  changed  size  or a changed checksum are selected for transfer.
       Since this whole-file checksumming of all files on both sides of the  con-
       nection  occurs  in  addition to the automatic checksum verifications that
       occur during a file's transfer, this option can be quite slow.

       Note that rsync always verifies that each transferred file  was  correctly
       reconstructed  on  the receiving side by checking its whole-file checksum,
       but that automatic after-the-transfer verification has nothing to do  with
       this  option's  before-the-transfer  "Does  this file need to be updated?"
       check.

इससे पता चलता है कि समान आकार और समय टिकटों का होना आपको विफल कर सकता है।

स्थापित करना

$ cd /tmp

$ mkdir -p {A,b}/1/2/{3,4}

$ echo "\___________from A" | \
      tee A/1/2/x  | tee A/1/2/3/y  | tee A/1/2/4/z  | \
  tr A b | \
      tee b/1/2/x  | tee b/1/2/3/y  | tee b/1/2/4/z  | \
      tee b/1/2/x0 | tee b/1/2/3/y0 >     b/1/2/4/z0

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from b
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from b
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from b
b/1/2/x0
\___________from b

Rsync जो कुछ भी कॉपी नहीं करता है क्योंकि सभी फाइलों का आकार समान है और टाइमस्टैम्प है

$ rsync -avu A/ b
building file list ... done

sent 138 bytes  received 20 bytes  316.00 bytes/sec
total size is 57  speedup is 0.36

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from b
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from b
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from b
b/1/2/x0
\___________from b    

Rsync जो सही ढंग से काम करता है क्योंकि यह चेकसम की तुलना करता है

$ rsync -cavu A/ b
building file list ... done
1/2/x
1/2/3/y
1/2/4/z

sent 381 bytes  received 86 bytes  934.00 bytes/sec
total size is 57  speedup is 0.12

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from A
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from A
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from A
b/1/2/x0
\___________from b

करता है -c और -u एक साथ अच्छी तरह से काम करता है?
सर्गेई कोरज़ोव

@SergeyKorzhov यह करता है। `-यू’ अभी भी हमेशा की तरह काम करता है ताकि गंतव्य केवल नया न हो।
ब्रूनो ब्रॉन्स्की

1

यह वही है जो मैं व्यक्तिगत फ़ाइलों का समर्थन करने के लिए उपयोग कर रहा हूं, जहां मुझे हर चीज के बारे में परवाह नहीं है -a, और अधिक उपयोगी जानकारी मुद्रित करना चाहते हैं।

rsync -rtu --delete --info=del,name,stats2 "/home/<user>/<src>/" "/run/media/<user>/<drive>/<dst>"

से rsync आदमी पेज :

-r, --recursive
यह rsync को पुनरावर्ती निर्देशिकाओं को कॉपी करने के लिए कहता है।

-t, --times
यह rsync को फ़ाइलों के साथ संशोधन समय को स्थानांतरित करने और उन्हें दूरस्थ सिस्टम पर अपडेट करने के लिए कहता है।

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

-delete
यह rsync को रिग्रेसस फाइल्स को रिसीविंग साइड (जो कि सेंडिंग साइड पर नहीं हैं) से डिलीट करने के लिए कहता है, लेकिन केवल उसी डायरेक्टरी के लिए जिसे सिंक किया जा रहा है।

--info = FLAGS
इस विकल्प की मदद से आप उस सूचना आउटपुट पर ठीक-ठीक नियंत्रण रख सकते हैं, जिसे आप देखना चाहते हैं।

से rsync --info=help

DEL        Mention deletions on the receiving side  
NAME       Mention 1) updated file/dir names, 2) unchanged names  
STATS      Mention statistics at end of run (levels 1-3)

जबकि कम स्पष्ट, यह प्रतीत होता है समकक्ष और छोटा है:

rsync -rtuv --delete --info=stats2 "/home/<user>/<src>/" "/run/media/<user>/<drive>/<dst>"

-v, --verbose
एक एकल -v आपको इस बारे में जानकारी देगा कि फाइलों को किस स्थान पर स्थानांतरित किया जा रहा है और अंत में एक संक्षिप्त सारांश [आंकड़े 1]।


0

यह पूरी तरह से वैसा नहीं है जैसा आप पूछते हैं, बल्कि आप एक संस्करण-नियंत्रण उपकरण का उपयोग करने पर विचार कर सकते हैं। Git जैसे उपकरण आपके द्वारा मांगी गई हर चीज को और अधिक करते हैं, खासकर यदि आप फ़ोल्डर B में सीधे काम नहीं करते हैं तो इस पर एक नज़र डालना दिलचस्प हो सकता है। आप यहाँ git के बारे में कुछ और जानकारी पा सकते हैं


2
यह तभी काम करता है जब आप संस्करण नियंत्रण में सब कुछ जोड़ने को तैयार हों। यह कभी भी स्थायी रूप से संग्रहीत होने के लिए किए गए हर परिवर्तन को भी मजबूर करता है, जो अवांछनीय हो सकता है।
कुदित

@ क्यूडिट, यह सच है, हालांकि इतिहास को सीमित करने के लिए क्लोनिंग के माध्यम से संभव है, लेकिन इतिहास को सीमित करके (डिफ़ॉल्ट रूप से) जीआईटी में लागू नहीं किया गया है।
स्विच87

@ switch87 हाँ, मुझे पता है कि आप पुराने कमिट्स को हटा सकते हैं। संस्करण नियंत्रण वास्तव में जेनेरिक बैकअप इमो के लिए एक उपयुक्त समाधान नहीं है, खासकर यदि बड़ी बाइनरी फाइलें हैं।
प्रात:

उनका प्रश्न स्थानीय बैकअप के लिए है, लेकिन यदि आप इसे रिमोट बैकअप के लिए उपयोग करते हैं, तो आप बड़ी फ़ाइलों के लिए गिट एनेक्स का उपयोग कर सकते हैं। स्थानीय बैकअप के लिए यह कोई समस्या नहीं है।
स्विच87

2
@ switch87 यह वास्तव में क्यू के लिए एक टिप्पणी होना चाहिए था और जवाब नहीं था क्योंकि यह नहीं बताता है कि आप बैकअप करने के लिए कैसे उपयोग करेंगे।
SLM

0

आप इसे इस तरह से उपयोग कर सकते हैं:

rsync -avu --delete /home/user/A/* /home/user/B/

इस तरह आप फ़ोल्डर A की सामग्री को फ़ोल्डर B में कॉपी करेंगे, न कि फ़ोल्डर A की सामग्री को स्वयं।

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