मेरे स्थानीय ड्राइव पर एक निर्देशिका के rsync के साथ एक ही ड्राइव पर एक और निर्देशिका के लिए एक अंतर बैकअप बनाएँ


4

मैं उसी स्थानीय ड्राइव पर स्थित किसी अन्य निर्देशिका के लिए अपने स्थानीय ड्राइव पर स्थित निर्देशिका का अंतर बैकअप बनाने के लिए rsync (लेकिन न तो rsnapshot और न ही rdiff- बैकअप और न ही किसी अन्य अनुप्रयोग) का उपयोग कैसे कर सकता हूं ?

F. Hauri ने anwser में निम्नलिखित पोस्ट किया कि स्थानीय बैकअप कैसे बनाएं? :

#!/bin/bash
backRepo=/media/mydisk
backSrce=/home/user
backDest=home
backCopy=copy
backCount=9

[ -d "$backRepo/$backDest" ] || mkdir "$backRepo/$backDest"

cd $backSrce || exit 1
rsync -ax --delete --exclude '*~' --exclude '.DStore' . "$backRepo/$backDest/."

cd $backRepo
[ -d "$backCopy.$backCount" ] && rm -fR "$backCopy.$backCount"
for ((i=$backCount;i--;));do
    [ -d "$backCopy.$i" ] && mv "$backCopy.$i" "$backCopy.$((i+1))"
  done
((i++))

cp -al $backDest $backCopy.$i

ऐसा लगता है कि उपरोक्त स्क्रिप्ट मैं जो चाहता हूं उसके काफी करीब है, लेकिन स्पष्ट रूप से लिनक्स के साथ ईज़ी ऑटोमेटेड स्नैपशॉट-स्टाइल बैकअप का अध्ययन करने में लगभग एक घंटा बिताने के बावजूद और रुसक मैं अभी भी केवल एक अस्पष्ट विचार रखता हूं कि rsync को कैसे करना है जो मुझे चाहिए।

यहाँ मेरा उपयोग मामला है:

मैं अपनी मशीन पर स्थानीय रूप से एक वीडियो संपादित कर रहा हूं। उस वीडियो से जुड़ी सैकड़ों फाइलों में से सभी का योग 5 gb (पांच गीगाबाइट) से कम होगा।

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

हर कुछ घंटों में, मैं अपने वीडियो से जुड़े अपने उपर्युक्त डेटा को अपने Google ड्राइव खाते में वापस करने के लिए एक बिल्कुल आसान तरीका चाहता हूं। मुझे कोई आपत्ति नहीं है कि मैं Google डिस्क पर एक फ़ोल्डर अपलोड करने का चयन करूं। मैं वास्तव में ऐसा करने को प्राथमिकता देना चाहता हूं क्योंकि इससे मुझे यह सुनिश्चित करने में मदद मिलेगी कि बैकअप वास्तव में पूरा हो रहा है।

बिस्तर पर जाने से पहले हर कुछ रातों में, मैं वीडियो फ़ाइलों वाली संपूर्ण फ़ोल्डर की प्रतिलिपि बना रहा हूं, जिसमें मेरे Google ड्राइव खाते तक कई सारे डेटा हैं।

मैं वृद्धिशील लोगों के लिए अंतर बैकअप पसंद करता हूं क्योंकि अगर मुझे Google ड्राइव से अपने डेटा को पुनर्स्थापित करने की आवश्यकता होती है, तो मैं संभवतः भ्रमित होने के बिना मैन्युअल रूप से ऐसा करने में सक्षम होऊंगा।

कृपया ध्यान रखें कि मैं निश्चित रूप से सैकड़ों उपयोगकर्ताओं का समर्थन करने वाले एक बड़े निगम में यूनिक्स एसईएस व्यवस्थापक नहीं हूं। मैं एक मात्र एक आदमी हूं जो एक आसान तरीका चाहता है, लेकिन जरूरी नहीं कि एक पूरी तरह से स्वचालित विधि हो, डेटा की भयावह क्षति के मामले में हर कुछ घंटों में अपने डेटा को वापस करने के लिए, जो मेरे कंप्यूटर की चोरी के कारण सबसे अधिक संभावना होगी । मैं लगभग निश्चित हूँ कि मैं क्या चाहता हूँ rsync कर सकते हैं। इसलिए, मैं एक और एप्लिकेशन इंस्टॉल करने के लिए अनिच्छुक हूं।

जवाबों:


0

ये रहा!

#!/bin/bash

# written by strobelight, you know who you are.
# license, MIT, go for it.

me=`basename $0`

EXCLUDES="\
    --exclude '*~'
    --exclude '.DS_Store'
"

CANDIDATES=/tmp/candidates

usage() {
    cat <<EOF

$me last_diff_dir new_diff_dir [ dir_to_copy ]

where:
    last_diff_dir  is the directory containing the last differential
    new_diff_dir   is the directory you want files saved to
    dir_to_copy    is optional and is the directory to copy from (default .)

cd directory_to_backup
Full backup: $me full_back full_back
Diff backup: $me full_back diff_1
Diff backup: $me full_back diff_2

EOF
    exit 1
}

get_dir() {
    HERE=`pwd`
    cd $1
    x=`pwd`
    cd $HERE
    echo $x
}

if [ $# -lt 2 ]; then
    usage
fi

LAST_DIR="$1"
NEW_DIR="$2"
DIR_TO_COPY="${3:-.}"

mkdir -p "$LAST_DIR" || exit 1
mkdir -p "$NEW_DIR" || exit 1

[ -d "$LAST_DIR" ] || usage
[ -d "$NEW_DIR" ] || usage
[ -d "$DIR_TO_COPY" ] || usage

LAST_DIR=`get_dir "$LAST_DIR"`
NEW_DIR=`get_dir "$NEW_DIR"`
DIR_TO_COPY=`get_dir "$DIR_TO_COPY"`

# get list of what's different
eval rsync -v --dry-run -axH --delete --update $EXCLUDES "$DIR_TO_COPY/" "$LAST_DIR" | awk '
    /building file list/ { next }
    /^$/ {next}
    /bytes.*received/ { nextfile }
    {
        for(i=5;i<NF;i++) {
            printf("%s ",$i)
        }
        printf("%s\n",$NF)
    }
    ' | sed 's:/$::' > $CANDIDATES
#cat $CANDIDATES

# use list to backup 
eval rsync --files-from=$CANDIDATES -lptgoDxH --delete $EXCLUDES ${DIR_TO_COPY}/ $NEW_DIR

उदाहरण के लिए, मेरी वर्तमान निर्देशिका में 3 8k फाइलें हैं:

$ ls -1sk
total 24
 8 seg1
 8 seg2
 8 seg3

मेरा पूर्ण बैकअप अभी तक मौजूद नहीं है, चलो उस निर्देशिका को full_bak कहते हैं

ls ../full_bak
ls: ../full_bak: No such file or directory

पहले हमें एक पूर्ण बैकअप की आवश्यकता है जिसमें से अंतर करना है। मैंने test123.sh के रूप में स्क्रिप्ट को मेरे $ HOME / बिन निर्देशिका में कॉपी किया है। जब दोनों आर्गन समान होते हैं, तो अनिवार्य रूप से एक पूर्ण बैकअप का प्रदर्शन होता है।

$HOME/bin/test123.sh ../full_bak ../full_bak

स्क्रिप्ट आउटपुट

.
seg1
seg2
seg3

अब देखिए ../full_bak

$ ls -1sk ../full_bak
total 24
 8 seg1
 8 seg2
 8 seg3

कुछ बदलाव करें

dd if=/dev/zero of=seg2 bs=512 count=11

पुष्टि करें कि मतभेद हैं:

$ diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ

अब एक अंतर बनाएँ

$ $HOME/bin/test123.sh ../full_bak ../differential1
seg2

अंतर को देखो बस पिछले पूर्ण बैकअप से अलग फ़ाइल thats

$ ls -1sk ../differential1/
total 8
 8 seg2

एक और बदलाव करें

dd if=/dev/zero of=seg4 bs=512 count=10

जांचें कि क्या अलग है

diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ
Only in .: seg4

और देखें कि हमारे पास एक नई फ़ाइल है जो हमारे पूर्ण बैकअप में नहीं है, और पहले से परिवर्तित फ़ाइल है।

एक और निर्देशिका के लिए एक और अंतर करो

$ $HOME/bin/test123.sh ../full_bak ../differential2
.
seg2
seg4

और देखें नए अंतर में 1 अंतर है और साथ ही नई फ़ाइल भी है

$ ls -1sk ../differential2
total 16
 8 seg2
 8 seg4

विभेदक बैकअप

यहाँ test123.sh का उपयोग करके एक फुलबैकअप रैपर है:

#!/bin/bash

FULLDIR=/media/mydisk/home
SRCDIR=/home/user

$HOME/bin/test123.sh $FULLDIR $FULLDIR $SRCDIR

यहाँ घंटे के आधार पर उप निर्देशिकाओं का निर्माण एक अंतर स्क्रिप्ट है:

#!/bin/bash

FULLDIR=/media/mydisk/fullbackup/home
DIFFDIR=/media/mydisk/differentials/home
SRCDIR=/home/user
DIFFSUB=`date '+BAK_%H'`

$HOME/bin/test123.sh $FULLDIR $DIFFDIR/$DIFFSUB $SRCDIR

हाय @Strobelight, बहुत बहुत धन्यवाद। मैंने लगभग आधे घंटे तक यह समझने की कोशिश की कि क्या करना है और क्या करने की कोशिश कर रहा हूं, लेकिन मैं असफल रहा। मैंने अपनी स्क्रिप्ट को अपने होम डायरेक्टरी में "test123.sh" के रूप में सहेजा है। मैंने प्रॉपर्टीज-> टेस्टिंग123.sh के लिए नेविगेट किया और "इस फाइल को प्रोग्राम के रूप में चलाने की अनुमति दें" के बगल में चेक बॉक्स को चेक किया। मेरी होम डाइरेक्टरी में मैंने ये डायरेक्टरी बनाई: last_diff_dir, new_diff_dir, और dir_to_copy। मैंने एक फ़ाइल dir_to_copy में डाल दी। मैं परीक्षण कर रहा हूं ।123.sh। फिर मैंने new_diff_dir चेक किया। वो खाली था। मुझे उम्मीद है कि आप मेरी मदद करेंगे। धन्यवाद,
येकुतिल

जिस स्थिति में कॉमा तुरंत ऊपर टिप्पणी में आपके नाम से जुड़ी है, आपको सूचित करने से रोकती है, मैंने इस टिप्पणी को कॉमा के बिना जोड़ा है।
याकुटील

हाय @Yututiel, आपकी टिप्पणियों के आधार पर यह प्रतीत होगा कि आप विंडोज़ का उपयोग कर रहे हैं न कि लिनक्स का। स्क्रिप्ट को प्रॉम्प्ट प्रॉम्प्ट से चलाया जाना चाहिए। बिना आर्ग के स्क्रिप्ट चलाना मदद दिखाता है। आपको उस निर्देशिका को बनाने की आवश्यकता नहीं है जिसकी उसे आवश्यकता है। मदद कुछ उपयोग दिखाती है। आपको कम से कम एक बार पूर्ण बैकअप बनाने की आवश्यकता है, और यह उसी निर्देशिका में पास होकर किया जाता है जैसे कि 1 2 args। तीसरा arg वह निर्देशिका है जिसे आप बैकअप लेना चाहते हैं और वैकल्पिक है क्योंकि यह डिफ़ॉल्ट रूप से वर्तमान निर्देशिका का उपयोग करता है। 1 2 args समर्थित निर्देशिका के भीतर निर्देशिका नहीं होना चाहिए। उम्मीद है की वो मदद करदे।
स्ट्रोबेलिटी

हाय @strobelight। आपके शीघ्र और विस्तृत उत्तर के लिए धन्यवाद। मैं Linux चला रहा हूँ (गैलियमओएस Xubuntu के शीर्ष पर 2.0 रन)। मैं अभी भी उलझन में हूं। मैं अक्सर दौड़ता हूं ... #! / Bin / sh gnome-स्क्रीनसेवर-कमांड --lock ... एक GUI से जिस तरह से मैंने परीक्षण कर रहा है, उसे चलाने का संकेत दिया123.sh। मैं अपने बाहरी USB को Grsync नामक एक ऐप का उपयोग करके rsync बैकअप बनाता हूं। Grsync में मैं निम्नलिखित देखने का विकल्प चुन सकता हूं ... rsync -r -t -v --progress --delete -s / home / y / test / input / home / y / test / output ... और फिर कॉपी करें एक टर्मिनल के लिए पेस्ट। लेकिन मैं GUI का उपयोग करना पसंद करता हूं। कृपया शुरू से अंत तक एक काल्पनिक उदाहरण के साथ ELI5 करें। धन्यवाद!
याकुतिल

मैं अपनी तल्ख टिप्पणी को स्पष्ट करना चाहता हूं। मुझे अनुरोध किए गए ELI5 काल्पनिक के लिए GUI की आवश्यकता नहीं है। इसके बजाय मैं ख़ुशी से उन्हें एक टर्मिनल में चलाऊंगा। मैं एक CLE के साथ ठीक से प्राप्त कर सकते हैं। लेकिन जीयूआई केवल मेरे दिमाग के लिए बेहतर काम करते हैं क्योंकि हालांकि मैं एक सटीक तार्किक तरीके से सोचता हूं, मुझे नहीं लगता कि "गणित में", मुझे लगता है कि "चित्रों में।" यह मैं पागल के साथ काम करने वाले देवों को चलाता था। वे कुछ ऐसा कहेंगे जैसे "2 + 2 = 4"। तब मैं उत्तर देता, "ओह। मैं देखता हूं। यदि आपके पास दो पेड़ हैं और दो और पेड़ हैं तो आपके पास कुल चार पेड़ हैं। क्या वे अकेले या एक जंगल में खड़े हैं?" वे कहेंगे, "हां। 2 + 2 = 4"
याकुतिल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.