#yum install rcs
backup_etc.bash
#!/bin/bash
# usage:
# 1. BACKUP_ROOT(/var/tmp/backup) に、バックアップをとりたいファイルへの
# シンボリックリンクを張ります
# 例: cd ${BACKUP_ROOT}; ln -s /etc/nsswitch.conf
# 2. backup_etc.bash を引数なしで実行します
# バックアップ作成用ディレクトリ
BACKUP_ROOT="/var/tmp/backup"
# バックアップ作成用ディレクトリ内の最大の深さ
MAX_DEPTH=2
# RCS のチェックインメッセージ(空白/タブを入れないこと)
CHECKIN_MSG="Automatic_RCS_backup"
# 引数に応じて、
# 「ディレクトリの深さ + 1」
# を表す glob パターンを生成する
# usage: make_pattern <depth>
# ex. make_pattern 1 → "*/*"
make_pattern () {
local -i i=$1
local pattern="*"
while [ $i -gt 0 ]; do
pattern="${pattern}/*"
let "i--"
done
echo "${pattern}"
}
# RCS の ci (チェックイン)コマンドを使って差分バックアップをとります
# 引数: なし
make_rcs_backup () {
local dir
local pattern=$(make_pattern ${MAX_DEPTH})
local lock_user
local file
local msg
# CHECKIN_MSG が設定されている場合だけ
# msg 変数の内容を -m"メッセージ" とします
msg=${CHECKIN_MSG:+"-m${CHECKIN_MSG}"}
# BACKUP_ROOT に移動
pushd "${BACKUP_ROOT}" > /dev/null
# RCS という名前以外のディレクトリを探す
# ※BSDシステムでは find -x . -type d ... とすること
find . -xdev -type d \( -name RCS -prune -o -print \) | \
while read dir; do
case "${dir}" in
${pattern})
# MAX_DEPTH を越えたものは対象外
continue
;;
esac
# 対象ディレクトリに移動
cd "${BACKUP_ROOT}/${dir}"
if [ ! -d RCS ]; then
mkdir RCS
fi
# ファイルごとに ci を実行
for file in *; do
if [ -d "${file}" ]; then
continue
fi
ci ${msg} -l "${file}" < /dev/null > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "backup FAIL: ${file}" 1>&2
fi
done
done
# 最初いたディレクトリに戻る
popd > /dev/null
}
make_rcs_backup
もしくは,rsyncを用いて差分バックアップを取る方法もある.
この場合,変更なきファイルはハードリンクとし,前回のバックアップから変更があったファイルのみ実際のコピーを行う為,バックアップの容量圧縮する事が可能となる.
rsync -av --delete --link-dest=../[過去] [現在]/ [保存名]
0 件のコメント:
コメントを投稿