使用 rsync 將本機磁碟機上的目錄建立到同一磁碟機上的另一個目錄的差異備份

使用 rsync 將本機磁碟機上的目錄建立到同一磁碟機上的另一個目錄的差異備份

我如何使用 rsync (但既不是 rsnapshot 也不是 rdiff-backup 也不是任何其他應用程式)來創建微分將本機磁碟機上的目錄備份到同一本機磁碟機上的另一個目錄?

F. Hauri 在 中發布了以下內容一個答案如何建立本地備份?:

#!/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

看起來上面的腳本與我想要的相當接近,但坦白說,儘管花了大約一個小時的時間來學習使用 Linux 和 Rsync 輕鬆實現自動快照備份我仍然對如何讓 rsync 做我想做的事情只有一個模糊的想法。

這是我的用例:

我正在我的機器上本地編輯影片。與該影片關聯的所有數百個檔案的總和將小於 5 GB(五 GB)。

目前,我使用 Grsync 將內部磁碟機備份到外部 USB 隨身碟。雖然我實際上已經知道如何使用 rsync 完成相同的任務,但我更喜歡使用 Grsync,因為我只需要啟動它,然後單擊一個按鈕即可將包含視頻文件的內部目錄備份到外部 USB 驅動器。整個過程如絲般順利。

每隔幾個小時,我就希望以相當順利的方式將與我的影片相關的上述資料備份到我的 Google Drive 帳戶。我不介意手動選擇將資料夾上傳到 Google 雲端硬碟。實際上,我更喜歡這樣做,因為這將幫助我確保備份實際上已完成。

每隔幾個晚上,在我睡覺前,我都會將包含影片檔案的整個資料夾(其中包含大量資料)複製到我的 Google Drive 帳戶。

與增量備份相比,我更喜歡差異備份,因為如果我需要從 Google Drive 恢復數據,我很可能能夠手動執行此操作,而不會感到困惑。

請記住,我當然不是支援數百個使用者的大公司的 UNIX 系統管理員。我只是一個想要一種簡單方法(但不一定是完全自動化的方法)的人,每隔幾個小時就異地備份一次數據,以防發生災難性數據丟失(這很可能是由於我的計算機被盜) 。我幾乎可以肯定 rsync 可以做我想做的事。因此,我不願意安裝另一個應用程式。

答案1

給你!

#!/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

首先我們需要一個完整的備份來進行差異化。我已將該腳本複製到我的 $HOME/bin 目錄中,名稱為 test123.sh。當兩個參數相同時,這實際上是在執行完整備份。

$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

查看差異,其中僅包含與上次完整備份不同的文件

$ 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

並看到新的差異有第一個差異以及新文件

$ 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

相關內容