Ubuntuで既にファイルが存在するディレクトリへのバックアップの設定

Ubuntuでバックアップの設定を調べながら行っていたのですが,
私のバックアップしたい状況がすこし特殊であり,シェルスクリプトを自分で作成したので
その内容を記録しておきます.

バックアップの仕様として,私が基本的にやりたいことはミラーリング(同期)でした.
ミラーリング」とは,ソース(バックアップ元)ディレクトリと同じ内容を
バックアップ先ディレクトリにコピーしますが,その際ソースに存在しない,
削除してしまったファイルなどは,ソースと同様バックアップ先ディレクトリからも
削除する,というものです.

単純なミラーリングであれば,rsyncコマンドで実現できます.
rsync -avh --delete /test/src/ /test/bak/
しかし私の環境では,バックアップ先のディレクトリには既にソースと同じカテゴリのファイルを
ディレクトリ分けして格納して置いており,ここに新たにソースのバックアップを作りたい
という状況でした.

具体的例でいうと,以下のようなディレクトリ構造であり,ソースのディレクトリC・Dを
バックアップ先にミラーリングしつつ,バックアップ先のディレクトリA・Bは
そのまま残したいという状況です.

ソースディレクト
バックアップ先ディレクト
この状況だと,単純にソースとバックアップ先を指定したrsyncコマンドでは
バックアップ先に既に置いていたディレクトリA・Bが削除されてしまいます.

そこで,以下のように,ソース内のディレクトリをリストアップし,
そのディレクトリのみバックアップ先にrsyncするシェルスクリプトを作成しました.


#!/bin/bash 
# 第一引数をSRC,第二引数をBAKに代入 
DIR_SRC=$1 
DIR_BAK=$2 
echo "Source directory: $DIR_SRC" 
echo "Backup directory: $DIR_BAK" 
 
# 指定されたDIR内のディレクトリごとに繰り返し 
for directory in `\find $DIR_SRC -mindepth 1 -maxdepth 1 -type d` 
do 
  # ディレクトリ名からbasenameを抽出してバックアップ先ディレクトリ名を作成 
  DIR_BASE=`basename $directory` 
  echo $directory/ 
  echo $DIR_BAK/$DIR_BASE/ 
  # バックアップ(ミラーリング)の実行
  rsync -avh --delete $directory$DIR_BAK/$DIR_BASE/ 
done 


このスクリプトを以下のようにcronに登録して,定期的に実行できるようにしました.
00 09 * * *  test  /test/backupdir.sh /test/src /test/bak 

これでバックアップ先の他のディレクトリA・Bを消さずにソースディレクトリのみを
ミラーリングできるようになりました.

【2021/03/29追記】
当初記事では,ソースディレクトリ内の繰り返しを以下のように記述していましたが,
for directory in `\find $DIR_SRC -mindepth 1 -type d` 
このままだと,例えばディレクトリC内にサブディレクトリがあった場合,そのサブディレクトリもバックアップディレクトリ直下にコピーされてしまいます.
そこで,以下のように"maxdepth"を指定することで,ディレクトリC直下のディレクトリをコピーする,というように修正しました.(本文修正済み)
for directory in `\find $DIR_SRC -mindepth 1 -maxdepth 1 -type d` 

参考: