ディレクトリのバックアップ戦略

ShellBeginner
オンラインで実践に進む

はじめに

毎日、成長している植物の写真を撮る場面を想像してください。すべての写真を plant.jpg という名前で保存すると、新しい写真を保存するたびに古い写真が上書きされ、履歴が失われます。すべての写真を残すには、plant_2023-01-01.jpg、plant_2023-01-02.jpg のように名前を付ける必要があります。

システムのバックアップでも同じ問題が起こります。常に同じファイル名に保存すると、新しいバックアップによって以前のバックアップが上書きされ、復元用の履歴が失われる可能性があります。

この実験では、この命名処理を自動化する方法を学びます。タイムスタンプ付きのバックアップは、実際の運用でよく使われる方法です。バックアップファイルは、いつ作成されたものかを判断でき、複数世代を保持できて初めて役立つからです。

次のことを学びます。

  1. 指定した形式で今日の日付を Linux に取得させる。
  2. 取得した日付を「入れ物」(変数)に保存する。
  3. その日付を使って、一意のタイムスタンプ付きバックアップファイルを作成する。

今日の日付を取得する

このステップでは、date コマンドを使って現在の日付を整形する方法を学びます。これは、動的なファイル名を作るための最初の材料です。

標準の date コマンドは、現在の日付と時刻を長い形式で表示します。しかし、ファイル名には通常、YYYY-MM-DD のような、簡潔で並べ替えやすい形式を使います。Linux では、+ 記号の後にフォーマットコードを指定して、出力形式を変更できます。%F は「完全な日付(Full Date)」、つまり年・月・日の形式を表す便利な省略コードです。

この形式は、見た目が整っているだけではありません。YYYY-MM-DD 形式を使うと、ファイル名をアルファベット順に並べたとき、時系列順にも並ぶため、実際の運用でも便利です。

まず、プロジェクトフォルダーにいることを確認します。

cd ~/project

次に、指定した形式で日付を取得します。

date +%F

2023-10-27 のような出力が表示されます(実際には今日の日付が表示されます)。

この結果をファイル名に使うには、結果を取得する必要があります。これには コマンド置換(Command Substitution) を使います。コマンドを $(...) という「囲み」の中に入れる方法だと考えてください。シェルはまず囲みの中のコマンドを実行し、その結果を取得して、囲みをそのテキストに置き換えます。

コマンド置換は、単純なコマンドライン操作と自動化を結び付ける、シェルの基本的な考え方の一つです。あるコマンドの出力を、別のコマンドのデータとして利用できます。

この日付を 変数(Variable) に保存してみましょう。変数は、名前の付いた保存用の入れ物です。current_date という名前の入れ物を作り、コマンドの出力をその中に保存します。

current_date=$(date +%F)

重要: = 記号の前後にスペースを入れないでください。これはシェルの厳密なルールです。variable = value は失敗しますが、variable=value は正しく動作します。

それでは、入れ物の中身に日付が入っていることを確認します。変数名の前に $ 記号を付け、echo コマンドを使って変数の値を表示します。

echo $current_date

今日の日付が表示されれば、日付を変数に正しく保存できています。

バックアップファイルを作成する

日付を変数に保存できたので、その日付を使って分かりやすい名前のバックアップファイルを作成できます。

ディレクトリには、project_plan.txt というファイルを用意してあります。次のコマンドで、そのファイルが存在することを確認します。

ls -l project_plan.txt

ここでは、このファイルのコピーを project_plan_YYYY-MM-DD.bak という名前で作成します。これにより、コピーに今日の日付を付けられます。

標準の cp(コピー)コマンドを使います。ただし、日付を手入力する代わりに、変数 $current_date を使ってシェルに日付を挿入させます。

次のコマンドを実行します。

cp project_plan.txt "project_plan_$current_date.bak"

シェルは二重引用符の中にある $current_date を検出すると、cp コマンドを実行する前に、変数に保存されている実際の日付(例:2023-10-27)へ置き換えます。

これは 変数展開(variable expansion) と呼ばれます。シェルは cp コマンドを起動する前に変数を展開します。そのため、cp 自体がシェル変数を理解していなくても、このコマンドを動的に実行できます。

ポイント: 変数を使うステップを省略し、1 行で実行することもできます。これは自動化スクリプトで非常によく使われる方法です。$(...) のコマンド置換を cp コマンドの中に直接記述します。

cp project_plan.txt "project_plan_$(date +%F).bak"

これはシェルに対して、「date コマンドを実行し、その結果をここに貼り付けてから、cp コマンドを実行する」と指示します。どちらの方法でも、まったく同じ結果になります。

バックアップを確認する

バックアップが正しく作成されたことを確認しましょう。現在、元のファイルとタイムスタンプ付きのコピーの 2 つがあるはずです。

ディレクトリ内のファイルを一覧表示します。

ls -l

次のような出力が表示されます。

-rw-rw-r-- 1 labex labex 65 Oct 27 10:00 project_plan.txt
-rw-rw-r-- 1 labex labex 65 Oct 27 10:05 project_plan_2023-10-27.bak

新しいファイル名に日付が含まれていることを確認してください。

最後に、コピーの内容が正しいことを確認します。cat コマンドを使って、新しいファイルの内容を表示できます。日付全体をもう一度入力する必要がないように、ここでもコマンド置換を使います。

cat project_plan_$(date +%F).bak

元のテキストが表示されます。

Phase 1: Initialization
Phase 2: Development
Phase 3: Deployment

成功です。タイムスタンプ付きのバックアップを正しく作成できました。翌日に同じコマンドを実行すると、翌日の日付を含む新しいファイルが作成されるため、履歴を安全かつ整理された状態で保持できます。

この単純な命名方法は、実際の運用でも幅広く活用できます。多くのバックアップローテーション方式は、まさにこの考え方から始まります。ファイル名に時刻情報を埋め込むことで、最新のコピーを上書きするのではなく、複数世代のバックアップを保持できます。

まとめ

お疲れさまでした。重要な自動化スキルを身に付けました。

この実験では、次のことを学びました。

  • 時刻の整形: date +%F を使って、コンピューターで扱いやすい日付文字列を取得する。
  • コマンド置換: $(...) を使って、あるコマンドの結果を別のコマンドに渡す。
  • 動的な命名: 現在の日付に基づいてファイル名を自動的に作成する。

この一見単純な方法は、プロフェッショナルなバックアップ戦略の基盤です。これで、ファイルが誤って上書きされることを防ぎ、バックアップを安全に管理できるようになりました。