ローカルドライブ上のディレクトリから同じドライブ上の別のディレクトリへの差分バックアップを rsync で作成する

ローカルドライブ上のディレクトリから同じドライブ上の別のディレクトリへの差分バックアップを rsync で作成する

rsync(ただしrsnapshotやrdiff-backupなどのアプリケーションは使用しない)を使用して、差額ローカル ドライブにあるディレクトリを、同じローカル ドライブにある別のディレクトリにバックアップできますか?

F.ハウリは次のように投稿した。答えローカルバックアップを作成するにはどうすればよいですか?:

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

上記のスクリプトは私が望んでいるものにかなり近いようですが、率直に言って、約1時間かけて勉強したにもかかわらずLinux と Rsync を使用した簡単な自動スナップショット スタイルのバックアップrsync を自分の望むように動作させる方法については、まだ漠然としたアイデアしかありません。

私の使用例は次のとおりです:

私は自分のマシン上でローカルにビデオを編集しています。そのビデオに関連付けられている数百のファイルの合計は 5 GB (5 ギガバイト) 未満になります。

現在、私は Grsync を使用して内部ドライブを外部 USB ドライブにバックアップしています。rsync を使用して同じタスクを実行する方法を実際に理解しましたが、Grsync を使用する方が好みです。起動してボタンを 1 回クリックするだけで、ビデオ ファイルを含む内部ディレクトリを外部 USB ドライブにバックアップできるからです。プロセス全体が非常にスムーズです。

数時間ごとに、ビデオに関連する上記のデータを Google Drive アカウントにスムーズにバックアップする方法が必要です。フォルダを Google Drive にアップロードすることを手動で選択してもかまいません。実際には、バックアップが実際に完了していることを確認できるため、手動で行う方がよいと思います。

数日おきに寝る前に、数ギガバイトのデータを含むビデオファイルを含むフォルダ全体を Google Drive アカウントにコピーしています。

私は増分バックアップよりも差分バックアップを好みます。なぜなら、Google ドライブからデータを復元する必要がある場合、混乱することなく手動で復元できる可能性が高いからです。

念頭に置いておいていただきたいのは、私は何百人ものユーザーをサポートする大企業の UNIX システム管理者ではないということです。私は、コンピュータの盗難による壊滅的なデータ損失に備えて、数時間ごとにデータをオフサイトにバックアップするための簡単な方法 (必ずしも完全に自動化された方法ではない) を求めている単なる 1 人の人間です。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

たとえば、現在のディレクトリには 8k のファイルが 3 つあります。

$ 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/bin ディレクトリにコピーしました。両方の引数が同じ場合、基本的に完全バックアップが実行されます。

$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

そして、新しい差分には、新しいファイルと同様に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

関連情報