サーバー運用や日々の作業で大切なデータを安全に保つために、定期的なバックアップは欠かせません。しかし手動でバックアップを取り続けるのは手間がかかります。そこでシェルスクリプトを利用して、指定したディレクトリを自動的にzipで圧縮、さらに世代管理まで行う仕組みを構築してみましょう。
スクリプトの動作概要
- 圧縮: 第一引数で指定したディレクトリをzip形式で圧縮します。
- バックアップ: 圧縮したzipファイルを、第二引数で指定したディレクトリに保存します。
- 世代管理: 第二引数で指定したディレクトリに10世代以上のバックアップファイルが存在する場合、最も古いファイルを削除します。
前提条件
- LinuxやmacOSなどのUnix系OSで動作することを前提としています。
zip
コマンドがインストールされている必要があります。インストールされていない場合は以下のコマンドでインストールできます
# Ubuntu/Debian系の場合
sudo apt install zip
# RHEL/CentOS系の場合
sudo yum install zip
シェルスクリプト
以下が、ディレクトリの圧縮と世代管理を行うシェルスクリプトの例です。
#!/bin/bash
# バックアップ元ディレクトリとバックアップ先ディレクトリ
SOURCE_DIR=$1
BACKUP_DIR=$2
# 日付付きのバックアップファイル名を作成
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
ZIP_FILE="$BACKUP_DIR/backup_$TIMESTAMP.zip"
# 引数チェック
if [ -z "$SOURCE_DIR" ] || [ -z "$BACKUP_DIR" ]; then
echo "Usage: $0 <source_directory> <backup_directory>"
exit 1
fi
# ソースディレクトリが存在するか確認
if [ ! -d "$SOURCE_DIR" ]; then
echo "Error: Source directory '$SOURCE_DIR' does not exist."
exit 1
fi
# バックアップ先ディレクトリが存在しなければ作成
if [ ! -d "$BACKUP_DIR" ]; then
echo "Backup directory does not exist. Creating '$BACKUP_DIR'."
mkdir -p "$BACKUP_DIR"
fi
# ディレクトリをzipで圧縮してバックアップ先に保存
zip -r "$ZIP_FILE" "$SOURCE_DIR"
echo "Backup completed: $ZIP_FILE"
# バックアップ先にあるzipファイルの数を確認し、10世代以上であれば最も古いファイルを削除
FILE_COUNT=$(ls -1 "$BACKUP_DIR"/*.zip 2>/dev/null | wc -l)
if [ "$FILE_COUNT" -gt 10 ]; then
OLDEST_FILE=$(ls -1t "$BACKUP_DIR"/*.zip | tail -n 1)
echo "Deleting oldest backup: $OLDEST_FILE"
rm "$OLDEST_FILE"
fi
echo "Backup process finished."
スクリプトの解説
- 引数のチェック:
第一引数(バックアップ元のディレクトリ)と第二引数(バックアップ先のディレクトリ)が指定されているかどうかを確認します。もし引数が不足していれば、スクリプトは使い方を表示して終了します。 - ディレクトリの確認:
バックアップ元のディレクトリが存在しなければエラーメッセージを表示して終了します。また、バックアップ先のディレクトリが存在しなければ自動的に作成します。 - 圧縮:
zip -r
コマンドを使用して、バックアップ元ディレクトリを再帰的に圧縮し、タイムスタンプ付きのzipファイルとしてバックアップ先に保存します。 - 世代管理:
ls -1
コマンドでバックアップディレクトリ内のzipファイルの一覧を取得し、10世代以上のファイルが存在する場合、最も古いファイルを削除します。ls -1t
でファイルを作成日時の降順で並べ、tail -n 1
で最も古いファイルを選択しています。
実行方法
スクリプトをファイルに保存し、実行権限を付与します。
chmod +x backup_script.sh
その後、スクリプトを以下のように実行します。
./backup_script.sh /path/to/source /path/to/backup
例: /home/user/documents
ディレクトリを圧縮し、/backup
ディレクトリに保存する場合:
./backup_script.sh /home/user/documents /backup
最後に
このスクリプトを使えば、定期的に自動バックアップを行うタスクをcron
などに設定することもできます。例えば、毎日深夜にこのスクリプトを実行するには、以下のようなcronジョブを設定できます。
0 0 * * * /path/to/backup_script.sh /home/user/documents /backup
シェルスクリプトは柔軟で、さらに細かい設定や追加の機能を簡単に実装できます。環境や要件に合わせてカスタマイズし、効率的なバックアップシステムを構築してみてください。
Visited 1 times, 1 visit(s) today