我如何使用 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