Rsync में नामांकित फ़ाइलों या निर्देशिकाओं को संभालना


26

मैं rsyncनिर्देशिका प्रतिकृति के लिए एक स्क्रिप्ट पर काम कर रहा हूं । मेरे पास यह केवल नई और संशोधित फ़ाइलों या निर्देशिकाओं को सिंक्रनाइज़ कर रहा है, लेकिन इस तथ्य को पसंद नहीं कर रहा है कि इसकी प्रतिलिपि बनाई गई फ़ाइलों या निर्देशिकाओं को एक नई फ़ाइल या निर्देशिका के रूप में रखा गया है, जो फ़ाइलों को सिंक में नहीं रखते हैं। मैंने 1MB की बैंडविड्थ सीमा भी निर्धारित की है क्योंकि यह व्यवसाय के काम के घंटों के दौरान चलेगा। यहाँ मेरी स्क्रिप्ट है:

rsync -zvru --bwlimit=1024  /mymounts/test1/ /mymounts/test2

अगर कोई अभी भी केवल नई या संशोधित फ़ाइलों की प्रतिलिपि बना रहा है, तो मैं फ़ाइलों और निर्देशिकाओं को सिंक में कैसे रख सकता हूं? यहाँ प्रश्न में फाइलें हैं

ls "/mymounts/test1/some stuff"
new directory  newfile1.txt  newfile3.txt  renamedFile.txt

ls "/mymounts/test2/some stuff"
new directory  newfile1.txt  newfile2.txt  newfile3.txt  renamedFile.txt

या फिर नाम बदलने वाली फ़ाइलों को किसी अन्य निर्देशिका में स्थानांतरित करने का एक तरीका भी होगा /mymounts/VerControl:?

जवाबों:


23

rsyncयदि स्रोत और लक्ष्य निर्देशिका पर फ़ाइल सिस्टम के पास हार्ड लिंक के लिए समर्थन है, तो आप स्थानांतरित और पुनर्निर्मित फ़ाइलों को संभाल सकते हैं । वास्तविक स्थानांतरण से पहले rsync को हार्ड लिंक को फिर से बनाने देना है। आप यहाँ एक शानदार व्याख्या पा सकते हैं ।

हमने एक सरल समाधान के साथ समाप्त किया, जो स्रोत / लक्ष्य निर्देशिका के अंदर हार्ड लिंक का एक छिपा हुआ पेड़ बनाते हैं, मूल स्क्रिप्ट इस तरह हो सकती है:

# Name of hidden directory
Shadow=".rsync_shadow"

# do real sync
rsync -ahHv --stats --no-inc-recursive --delete --delete-after "$Source"/ "$Target"

# update/create hidden dir of hard links in source
rsync -a --delete --link-dest="$Source" --exclude="/$Shadow" "$Source"/ "$Source/$Shadow"

# update/create hidden dir of hard links in target
rsync -a --delete --link-dest="$Target" --exclude="/$Shadow" "$Target"/ "$Target/$Shadow"

GitHub पर मेरे पास एक उदाहरण स्क्रिप्ट है । लेकिन मैं आपको सलाह देता हूं कि उत्पादन पर इस पद्धति का उपयोग करने से पहले एक बड़ी मात्रा में परीक्षण करें।


इसके अलावा "शानदार विवरण" आप भी इस महान मूल rsyncलेख, FWIW को संदर्भित करता है । सब कुछ
linlin.org/rsync

19

आप -y | --fuzzyrsync विकल्प को देखना चाह सकते हैं । इसके अलावा, rsync का नाम बदलने पर नज़र रखने का कोई तरीका नहीं है, इसलिए आप नाम बदलकर फ़ाइल स्थानांतरित करेंगे।

Rsync मैनपेज से:

   -y, --fuzzy
          This option tells rsync that it should look for a basis file for
          any  destination  file  that  is missing.  The current algorithm
          looks in the same directory as the destination file for either a
          file  that  has  an identical size and modified-time, or a simi-
          larly-named file.  If found, rsync uses the fuzzy basis file  to
          try to speed up the transfer.

7
ध्यान दें कि, यदि --fuzzyआप उपयोग कर रहे हैं , तो आपको इसके साथ युग्मन पर विचार करना चाहिए --delete-delay, क्योंकि "डिफ़ॉल्ट रूप से rsync एक करता है --delete-before, इस प्रकार आधार फ़ाइल को हटाने से पहले इसे कॉपी / स्थानांतरित किया जा सकता है" । स्रोत: सोनिया हैमिल्टन
रॉनन जौचेट

1

आप नहीं कर सकते।

रुपये में तीन मोड हैं,

  • सभी फ़ाइलों की प्रतिलिपि बनाएँ
  • मौजूदा (संशोधित / गैर-संशोधित) फ़ाइलों की प्रतिलिपि बनाएँ - इस पर आपके पास कई विकल्प हैं
  • गैर-मौजूदा फ़ाइलों की प्रतिलिपि बनाएँ।

हालाँकि इन तीन मोड में दो उपश्रेणियाँ हैं,

  • पर छोड़ दें
  • पर शामिल करें

Rsync ट्रैक नहीं करता है कि किन फ़ाइलों का नाम बदला गया है, इसकी कोई स्थिति नहीं है। सभी फ़ाइलों की प्रतिलिपि बनाने के बजाय विचार करें, और उन लोगों को छोड़कर जिन्हें आप नहीं चाहते हैं। आपके पास स्थानांतरण-श्वेतसूची नहीं हो सकती है, आपके पास ब्लैकलिस्ट हो सकती है।

rsync [..stuff..] --exclude 'lib/'

इनपुट के लिए गोच धन्यवाद फिर से नामांकित फ़ाइलों के साथ रहना होगा।
मई

आपके पास मौजूद फ़ाइलों को हटा सकते हैं, यह पूरी तरह से ठीक है। लेकिन प्रतिलिपि के एक फ़ंक्शन के रूप में, यदि आप स्रोत पर नाम बदलते हैं, तो यह नामांकित फ़ाइल की प्रतिलिपि बनाएगा।
इवान कैरोल

मैं -b वाले संस्करणों को रख सकता हूं और प्रत्यय = date +%Y%m%d%k%M%Sवैसे भी मुझे प्रत्यय = date +%Y%m%d%k%M%S.ORIGINALSUFFIX मिल सकता है ?
जितमूजा

0

जहाँ तक मुझे पता है, rsyncफ़ाइलों के नामकरण को नहीं पहचान सकते हैं। नई फ़ाइलों को फिर से स्थानांतरित करना होगा। देखें आर्टीम का जवाब

हटाई गई फ़ाइलों को हटाने के लिए, --deleteविकल्प का उपयोग करना सुनिश्चित करें ।

इसके अलावा, मिररिंग के लिए, मैं आपको -a( संग्रह ) का उपयोग करने की सलाह दूंगा, जिसमें कुछ अच्छे विकल्प हैं।

man 1 rsyncविवरण के लिए एक नज़र है ।


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