導入
自動化の第一歩は、たいていバックアップです。「毎日、決まった場所を、日付つきで、保存先に複製する」。第2章の $( ) と第4章の守り、第8章の cron が、ここで1つにつながります。
説明
組み立ての順番は、いつも同じです。設定 → 事前チェック → 本体 → 記録。
#!/bin/bash
set -eu
# 1. 設定(変えたくなったらここだけ)
SOURCE_DIR=/home/user/logs
BACKUP_DIR=/home/user/backup
TODAY=$(date +%Y%m%d)
# 2. 事前チェック
if [ ! -d "$SOURCE_DIR" ]; then
echo "エラー: $SOURCE_DIR がありません" >&2
exit 1
fi
[ -d "$BACKUP_DIR" ] || mkdir "$BACKUP_DIR"
# 3. 本体
DEST="$BACKUP_DIR/logs-$TODAY"
mkdir "$DEST"
for file in "$SOURCE_DIR"/*.log; do
cp "$file" "$DEST"
echo "コピー: $file"
done
# 4. 記録
echo "バックアップ完了: $DEST"
ls "$DEST"
ポイントは4つです。
- 日付をファイル名に入れる(
logs-20260830)。上書きせずに履歴が残る - 保存先が無ければ作る(
[ -d … ] || mkdir …) - 元が無ければ止める(空のバックアップを作って「成功」と勘違いしない)
- 何をしたかを出力する(cron に登録したとき、ログとして残る)
flowchart TD
A["設定: 元・先・日付"] --> B{"元はある?"}
B -->|"ない"| C["エラーで終了"]
B -->|"ある"| D["保存先を用意"]
D --> E["1ファイルずつコピー"]
E --> F["完了を出力"]
実務では、コピーではなく tar で1つにまとめて圧縮するのが普通です(tar czf backup-$TODAY.tar.gz "$SOURCE_DIR")。さらに「30日より古いバックアップを消す」処理を足せば、ディスクを食い潰しません。
やってみよう
スクリプトを実行して、backup/logs-(日付)/ にログがコピーされることを確かめましょう。端末で ls backup と打つと、日付つきのディレクトリが見えます。もう一度実行するとエラーになります(同じ名前のディレクトリが既にあるため)——ここを mkdir -p にすると解決します。試してみてください。
演習
このスクリプトを実行して、バックアップを作成してください(バックアップ完了 が出ればOK)。
ヒント1を見る
「▶ 実行」ボタン、または端末で sh script.sh。
ヒント2を見る
2回目の実行でエラーになったら「最初からやり直す」を押すか、mkdir を mkdir -p に変えます。