タイムスタンプのついたバックアップファイルを簡潔に作成する方法

シェル

こんにちは。Enjoy IT Life管理人の仁科(@nishina555)です。

サーバーの設定ファイルを編集する時など、ファイルをバックアップしておきたいケースはよくあります。

みなさんはバックアップをとる場合、どういったコマンドを実行していますでしょうか。

単純なコマンドは以下のようなものかと思います。

$ cp ファイル名 ファイル名.2019030221 # ← 手動でタイムスタンプを入力

色々な方法があると思いますが、結論をさきに紹介すると個人的には以下のコマンドが一番簡潔ではないかと思います。

$ cp -p ファイル名{,.`date "+%Y%m%d%H"`}

今回紹介したかった内容は上記の内容でほぼ終わりなのですが、それだけだと寂しいので、コマンドの解説等をしたいと思います。

なお、環境はUNIX系OSを前提としております。

dateコマンドについて

dateコマンドは日付を出力するコマンドです。

普通に実行すると以下のようになります。

$ date
2019年 3月 2日 土曜日 21時15分56秒 JST

+でフォーマットを指定することができます。↓

$ date "+%Y%m%d%H"
2019030221

$ date "+%Y%m%d_%H%M%S"
20190302_211611

フォーマットには色々なパターンが存在します。
例えば西暦を表現する方法も%Y(4桁の年)以外にも%y(下2桁の年(00 〜 99))や%-y(0 〜 99)などがあります。

dateコマンドについてはこちらの『date コマンド』で詳しく解説されています。

タイムスタンプの作成はdateコマンドを活用して自動で生成するとよい

dateコマンドを利用することでタイムスタンプを自動で生成することができます。

ですので、タイムスタンプのついたバックアップファイルを作成する時はdateコマンドを活用するといいでしょう。

なお、dateコマンドでタイムスタンプを作成する際はバッククォートでコマンドを囲むようにします。

シェルでは、バッククォートでコマンドを囲むことで実行結果の値を利用することができます。

$ echo date "+%Y%m%d%H"
date +%Y%m%d%H # 文字列としてか認識されない

$ echo `date "+%Y%m%d%H"`
2019030221 # バッククォートで囲むことでコマンドの結果を取得できる

dateコマンドを利用したバックアップファイルの作成方法

実際にバックアップをとるときは以下のようになります。

$ cp -p ファイル名 ファイル名.`date "+%Y%m%d%H"`

-pオプションを利用することで、元ファイルのパーミッションなども保持できるので、より丁寧なバックアップファイル作成方法になります。

共通部分を抽出することでcpコマンドが簡潔に書ける

シェルのブレース展開と呼ばれる機能を利用すると先ほどのコマンドが以下のようにかけます。

$ cp ファイル名{, .`date "+%Y%m%d%H"`}

シェルではカンマ区切りされた文字列を『{}(ブレース、中括弧)』で囲むことで、文字列を展開することができます。

言葉で説明するとわかりにくいのですが、中学数学の『式の展開』を思い出すと想像がつきやすいのではないでしょうか。

ブレース展開を利用すると共通部分をまとめることができるので、バックアップファイル作成のコマンドが簡潔にかけます。

補足:戻し用バックアップファイルならタイムスタンプの粒度は『時』までにしておく

dateコマンドのフォーマットを利用することで秒単位のタイムスタンプを生成することができます。

$ cp ファイル名{, .`date "+%Y%m%d_%H%M%S"`}

ただ、実践的なことを考えるとタイムスタンプは『時』くらいでちょうどいいと思っています。

というのも、分や秒単位でバックアップファイルなんて作らないと思うので、『時』まで記載されていればファイルを識別することができるからです。

他にも、例えばバックアップファイルを利用してファイルをもとに戻そうとしたとき、秒単位までタイムスタンプに記載されていると、以下のような感じで戻し作業がうまくいかないです。

$ cp hoge{,.`date "+%Y%m%d_%H%M%S"`}

...
(作業をして問題が発生)
...

$ mv hoge{.`date "+%Y%m%d_%H%M%S"`,}
mv: hoge.20190302_212704: No such file or directory # 戻すときにタイムスタンプが変わっているのでファイルがみつからない

しかし、『時』までの粒度であれば数十分の作業後に戻し作業をする場合でも以下のコマンドで戻すことが可能です。

$ cp hoge{,.`date "+%Y%m%d%H"`}

...
(作業をして問題が発生)
...

$ mv hoge{.`date "+%Y%m%d%H"`,}

特に、リリースの前のバックアップファイルなどの場合は戻すときのことも考えて『時』くらいにしておくといいでしょう。

まとめ

以上でタイムスタンプつきのバックアップファイルを簡潔に作成する方法の紹介を終わります。

今回のまとめ
  • dateコマンドをバッククォートで囲むことでタイムスタンプを自動で作成できる。
  • 『cp -p』でパーミッション情報も保持してコピーできる
  • ブレース展開を利用することで共通部分がまとまりシェルコマンドが簡潔になる
  • 戻し用のバックアップファイルならタイムスタンプの粒度は『時』くらいまでにしておく

この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!