本文へスキップ
BecomeCoder

シェルスクリプトコース · 第9章 実践 · レッスン40

バックアップスクリプト ― 日付つきで保存する

ブラウザで完結

導入

自動化の第一歩は、たいていバックアップです。「毎日、決まった場所を、日付つきで、保存先に複製する」。第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回目の実行でエラーになったら「最初からやり直す」を押すか、mkdirmkdir -p に変えます。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

シェルスクリプト(シミュレート)

スクリプトを書くエディタと、それを動かす仮想シェルを読み込みます(本物のbashではなく、動きを再現した学習用の環境です)。
スクロールして表示された時点でも自動で読み込まれます。