Windowsで更新されたファイルだけ効率的にバックアップする方法

私はファイルのバックアップに市販のバックアップソフト等は使っていない。不定期に外付けHDDにフォルダを丸ごとコピーしているだけである。

この方法のメリットは、復元が必要な場合は単純にファイルをコピーし直すだけで良いという点。

一方、例えばエクスプローラーを使ってドラッグアンドドロップでフォルダを丸ごとコピーする場合、2回目以降のバックアップで以下の点が問題になる。

  1. 同名のファイルの処理方法(上書きするか?)を毎回聞かれる
  2. 削除/移動したファイルがそのまま残ってしまう

いったん古いバックアップを削除してからコピーし直せば良いのだが、そうすると毎回フルバックアップすることになるので時間がかかってしまう。

毎回マウスでファイルを移動するのも面倒だし、うっかりコピー元とコピー先を逆にしてしまったりすると大惨事である。

robocopyコマンドを使う

こういったバックアップのためのファイルコピーにはrobocopyコマンドを利用するのが便利である。

robocopyコマンドは、変更されたファイル(更新日時またはサイズが異なるもの)は上書きコピーし、それ以外のものはスキップするのが規定の動作なので、先に挙げた1. の問題を解決出来る。

また、オプションでコピー元から削除されたファイルをバックアップからも削除することが可能で、2. の問題も解決できる。

コピー元とコピー先の選択肢が広いというのも利点。ネットワークドライブのファイルをバックアップしたりも出来るし、逆にネットワークドライブにバックアップすると言うことも可能。

コマンド例

私は次のようなコマンドでバックアップを取っている。

robocopy コピー元フォルダ コピー先フォルダ /mir /r:3 /log+:ログファイル名 /np
具体例:
robocopy D:\Data Z:\Data /mir /r:3 /log+:Z:\Data.log /np

いくつかオプションを指定しているがそれぞれの意味は以下の通り。

/mir

ミラー化、つまりコピー元とコピー先の構成を全く同じにするオプション。空のフォルダもコピー対象になるのと、コピー元で削除されたファイルがコピー先からも削除される。

/r:3

コピーが失敗した際の再試行回数。これを指定しないとデフォルトで1,000,000回という意味不明な回数に設定されてしまう。私は3回に設定している。だいたい、3回も失敗すれば何度やっても同じだろう。

/log+:ログファイル名

バックアップの履歴をログに残すためのオプション。ファイルが無ければ新規作成され、既存のファイルを指定した場合は末尾に追記されていく。

/np

コピーの進捗を出力しないオプション。ログファイルを出力する場合、このオプションを指定しないとログファイルに進捗率が表示されて非常に見づらくなる。

簡単に実行できるようにする

バックアップを取るたびにコマンドを入力するのが面倒な場合は、バッチファイルを作ってデスクトップにでも置いておけば良い。

バックアップを取りたいフォルダが複数ある場合は、それらを全て羅列しておけば一度に実行出来るのでそういう意味でも便利。

例: robocopy_start.bat

robocopy D:\Data      Z:\Data               /mir /r:3 /log+:Z:\Data.log    /np
robocopy G:\Static    Z:\Static             /mir /r:3 /log+:Z:\Static.log  /np
robocopy X:\webapps\  Z:\Limestone\webapps\ /mir /r:3 /log+:Z:\Limestone.log /np
robocopy Y:\backup\   Z:\Marble\database\   /mir /r:3 /log+:Z:\Marble.log /np
robocopy Y:\webapps\  Z:\Marble\webapps\    /mir /r:3 /log+:Z:\Marble.log /np

ちなみに、バッチファイルのファイル名をrobocopy.batとしてしまうと無限ループが発生するので注意。私はこれで小一時間悩んだことがある。

バッチファイルに書いたrobocopyが、自分自身(robocopy.bat)と解釈されてしまうのが原因。バッチファイル内でrobocopyを絶対パス指定(C:\Windows\System32\Robocopy.exe)すれば解決できるが、バッチファイルの名前を変えた方が早い気がする。

デメリット

robocopy自体は、バックアップ用途というより単純にフォルダの内容を同期するためのコマンドなので、バックアップの世代管理は出来ない。ファイルを過去の特定の時点に戻すといったことは出来ないので、その場合はファイル履歴機能を使ったバックアップを行うべきである。

コメント

タイトルとURLをコピーしました