データのバックアップについて考えてみました(その2)

2018年05月15日

なんかgoogleドライブのことを書いたからか、google Oneが出てきましたね。

容量2TBで9.99ドル/月。

3TBで9.99ドル/月ならクラウドに乗り換えるんだけどなー。

惜しいなぁ(チラッチラッ)

とりあえず現状はローカルでバックアップしておいて、写真等の重要なデータは最悪googleフォトから復元することにします。

で、NASに週1くらいでデータをバックアップするんですが、当然手動は面倒くさいので自動化します。

基本的な要求は

  • 週1くらいで選択されたフォルダをNAS上にバックアップ
  • 世代管理は1世代のみでOK
  • 世代管理の必要がない場合は元の世代管理されたファイルを保持
  • あくまで世代管理するのはファイルで、空フォルダはどうでもよい

といったところですか。

無料で世代管理までできるソフトといえば「Bunbackup」が有名ですが、高速ファイルチェックでバックアップすると空フォルダがゴミとして溜まるみたい。

速度もWindows標準装備の「robocopy」コマンドより遅いですね。

というわけでbatファイルで実現可能か調べます。

「robocopy 世代管理」とかで検索かけると何件かbatが出てきますが、どれも世代管理ファイルが元のファイルと同じくらい必要になるので使い物になりません。

あくまで「変更・削除されそうなファイルを世代管理フォルダによけておく」イメージです。

なんでしょうね。

みなさん、容量が有り余ってるんでしょうか?

仕方ないので自作しました。

下図のbatファイルを「BackupEach.bat」みないなファイル名で保存しておいて、

  • 引数1=バックアップ元フォルダ
  • 引数2=バックアップ先フォルダ
  • 引数3=世代管理フォルダ
  • 引数4=ログファイル

として呼び出します。

例えば

Call BackupEach.bat srcdir dstdir logdir\dstdir logdir\log.txt

みたいにするとsrcdirの内容がdstdirに同期保存されて、元々destdirに入っていたファイルで更新されてしまいそうなものはlogdir\dstdirフォルダに退避されます。

連続で使用したりタスクに登録する場合はこちらもbatファイルに記述してください。

とりあえず軽く解説。

引数の最後に\記号がついていた場合、面倒くさいので14行目で取り除きます。

26行目の処理はもし同期先を同期元に同期させたかどうなるかでファイルの更新具合をログファイルに出力しています。

/Lオプションがついているので実際には同期しません。

robocopyのオプションの/Copy:DTと/FFTはNASでない場合は不要です。

とりあえず進んでいるかどうか目視したいので/TEEオプションもつけています。

robocopyのログファイルの中で「*EXTRA File」「*EXTRA Dir」は同期元に追加される予定のファイルで現状同期元には存在しないので、世代管理できません。

それ以外の「新しいファイル」「古いファイル」は現在同期元に存在して、次の同期で更新されてしまうので世代管理フォルダに退避させます。

41行目でログファイルから更新するファイル名を標準出力から拾い出すんですが、inの中のコマンドを記述する場合は'で囲って、パイプライン|はエスケープシーケンス^をつけないと強制終了しちゃうんで注意です。

深い階層のファイルはフォルダを作ってから移動させるために44行目で「フォルダを作る」「ファイルを移動する」動作を行うサブルーチンに飛ばしています。

退避が終わったら49行目で実際に同期させます。

テストしてみて問題なければ、タスクに登録すれば好きな周期でバックアップが取れますよ。

1回目は非常に時間がかかるので注意です。


※最初に試す場合は、特にコピー先のドライブはバックアップを取るか、必要なデータがない状態で試してください。

ミラーリングパスの設定を誤ると、意図しないフォルダやファイルがミラーリングされ、上書きされてしまう場合があります。

すべては自己責任において実行してください。


tag: ブログ 技術 Windows

無料でホームページを作成しよう! このサイトはWebnodeで作成されました。 あなたも無料で自分で作成してみませんか? さあ、はじめよう