連載
» 2017年11月29日 05時00分 公開

Tech TIPS:Windowsの「robocopy」コマンドでフォルダをバックアップ/同期させる

Windowsでファイルをバックアップするには、2つのフォルダの内容を同期させるrobocopyコマンドが利用できる。robocopyではフォルダの同期機能をはじめ、さまざまなオプションを指定してのコピーができる。2つのフォルダの内容を完全に同期させるには/mirオプションを利用する。

[打越浩幸, 島田広道,デジタルアドバンテージ]

対象OS:Windows 7/Windows 8/Windows 8.1/Windows 10/Windows Server 2008 R2/Windows Server 2012/Windows Server 2012 R2/Windows Server 2016


robocopyコマンドとは

 2つのフォルダの内容を同期させ、ファイルやフォルダの内容を同じ状態に保つ機能は、ファイルサーバのバックアップや個人的なデータのバックアップ、リモートオフィス同士でのデータの同期など、システム管理のさまざまな場面で利用される。

 このような用途に利用できるコマンドとして、copyやxcopyコマンドがある。

 フォルダの同期に利用できるツールとしては、この他にも「robocopy.exe」というコマンドラインツールがある。

 robocopyは、もともとはリモートのファイルサーバ同士でファイルやフォルダ、ユーザープロファイルデータなどを同期させるために作られたコマンドである。その名前は「Robust File Copy」の略であり、堅固(robust)で確実なファイルコピーという意味を持つ。具体的な機能の例を以下に記す。

  • エラー時の再試行回数の制限や待ち時間の指定
  • ネットワーク切断時のコピーの中断と再開
  • 属性やセキュリティ設定のコピー
  • ファイルサイズや変更時刻などを限定してのコピー
  • コピー先にある余分なファイルの削除
  • 256文字を超える長いパス名の処理
  • 動作ログの記録
  • 作業内容やオプション設定などをジョブとして保存
robocopyコマンドの動作 robocopyコマンドの動作
フォルダ間で更新コピーするには、「xcopy /e /d……」コマンドも利用できる。だがxcopyと比較すると、robocopyコマンドは、コピー先だけにあるファイルやフォルダ(EXTRA File)を削除できる他、サイズや更新日付を限定してのコピー、再試行回数制限、ログの記録、ジョブ定義、ファイルやフォルダの(コピーではなく)移動ができるなど、機能が豊富である。

 このようにrobocopyは多くの機能を備えている。本TIPSではrobocopyの基本的な使い方として、2つのフォルダを同期させる機能と、ログや設定を保存する機能について解説しておく。それ以外の機能については次のTIPS記事を参照していただきたい。

 より高度なrobocopyの使い方については、今後別TIPSで紹介する。

robocopyのヘルプを参照するには

 robocopyコマンドの使い方やオプションは、コマンドプロンプトで「robocopy /?」を実行すると表示される。

robocopyのヘルプ robocopyのヘルプ

robocopyの基本的な使い方

 robocopyでは、copyやxcopyコマンドのように、引数としてコピー元とコピー先、オプションなどを指定する。

robocopyコマンドの書式 robocopyコマンドの書式
2つのフォルダ間でファイルをコピーする
コピー元フォルダの内容を、指定したフォルダへコピーする。何もオプションを付けないと、コピー元フォルダにある「ファイルのみ」がコピーされる。フォルダは対象外。

 コピー元もコピー先もフォルダであり(ファイル名やワイルドカードは指定不可)、指定されたフォルダ間で、その中にあるファイルがコピーされる。コピー先として指定されているフォルダが存在しない場合は、フォルダが新規作成され、その中へコピーされる。

 コピー元やコピー先には、ローカルのフォルダだけでなく(例:c:\srcfolder)、UNCによるリモートのサーバ上の共有フォルダも指定できる(例:\\server1\drivec\destfolder)。

 ただしデフォルトではサブフォルダはコピーされず、さらに次の種類のファイルだけが上書きでコピーされる。

  • コピー先に存在しないファイル
  • 名前が同じでも、更新日付が異なるファイル(新しいファイルだけではなく、コピー元の方が古くてもコピー対象となる)
  • 名前と日付が同じでも、サイズが異なるファイル
robocopyでコピーされるファイルの種類 robocopyでコピーされるファイルの種類
デフォルトでは、このような条件に一致するファイルがコピーされる。オプションを指定すれば、新しいファイルだけをコピーさせたり、同じファイルでも強制上書き再コピーさせたりできる。

 xcopyコマンドに/dオプションを付けると更新されたファイルだけをコピーするが(TIPS「xcopyでファイルをバックアップする」参照)、robocopyではコピー元の方が古くてもコピーされるなど、少し挙動が異なる。

 どのような種類のファイルをコピーするかは、ファイルの「クラス」に基づいて決まる。クラスとは例えば、日付が新しいか古いか、サイズが異なるか、属性が異なるか、などの状態のことを指す。どのクラスに該当するファイルをコピーするかはオプションで指定できる。詳細なオプションについては以下のTIPSを参照していただきたい。

 実際に利用する例を次に示す。

ファイルのコピー ファイルのコピー
オプションなしでrobocopyを実行すると、コピー元のフォルダにあるファイルが、コピー先フォルダへコピーされる。フォルダはコピーされない。

特定の拡張子やワイルドカード指定に一致するファイルのみをコピーする

 robocopyをオプション指定なしで実行すると、デフォルトでは「*.*」、つまり全てのファイルがコピーの対象となる。オプションとしてファイルのパターンを指定すると、そのパターンに合うファイルのみがコピーの対象となる。例えばJPG/JPEG画像ファイルだけをコピーするには、次のようワイルドカード指定を追加する(パターンは複数指定可能)。

※2つのフォルダ間でJPG/JPEGファイルをコピーする例

robocopy c:\src d:\dest *.jpg *.jpeg



サブフォルダまで含めて再帰的にコピーする

 robocopyに何もオプションを付けないと、指定されたフォルダ中にあるファイルだけがコピーの対象となる。これをサブフォルダも含めて全部コピー(上書き更新)するには「/s」オプションを付ける。ただし/sだけでは、空のフォルダはコピーされない。空フォルダも含めてサブフォルダをコピーするには「/e」(/s /eでも同じ)を付けて実行する。これらのオプション名はxcopyコマンドと同じである。

サブフォルダも含めてコピーするためのオプション サブフォルダも含めてコピーするためのオプション
/sを付けるとサブフォルダもコピーされるが、空フォルダは除外される。空フォルダもコピーしたい場合は、/sの代わりに/eを付ける(/s /eのように両方付けても問題ない)。

 実行すると次のようになる。

サブフォルダのコピー サブフォルダのコピー
/sや/eオプションを付けると、サブフォルダもコピー対象となる。

2つのフォルダを完全に同期させて、ミラーコピーを作る

 /sオプションを使うと、コピー元のファイルやサブフォルダがコピー先へ上書き更新されるが、この場合、もしコピー先に余分なファイル(コピー元にはないファイル)があっても、そのファイルは何もされずに(削除されずに)、そのまま残ることになる。

 この挙動を変更して、2つのフォルダの内容をサブフォルダも含めて完全に同期させる(同じ状態にする)には、「/mir」(ミラー)オプションを指定する。

ミラーコピーするためのオプション指定 ミラーコピーするためのオプション指定
/mirを付けると、ファイルを上書き更新するだけでなく、コピー先に不要な(=コピー元にない)ファイルやフォルダがあれば削除される。

 /mirオプションを付けると、コピー元フォルダと同じ状態になるように、コピー先フォルダへファイルがコピーされる。コピー先に不足するものがあれば新規作成されるし、日付やサイズが相違するファイルがあれば上書き更新される。さらに、コピー先に余分なファイルやフォルダがあれば、それらは削除される。サブフォルダの内容もコピーされる(/s/eオプションは不要。実際には、サブフォルダをコピーする/sと、余分なファイルを削除する/purgeを組み合わせたものが/mirオプション)。

robocopyでミラーコピーを作る robocopyでミラーコピーを作る
/mirオプションを付けると、不足するファイルやフォルダをコピーするとともに、日付やサイズが異なるファイルをコピーし、さらにコピー元には存在しない余分なファイルやフォルダを削除する。コピー後は、コピー元とコピー先が同じ状態になる。

 /s/eだけでは、同じコピー先に対して何度もコピーすると、コピー先に不要なファイル(=コピー元にすでに存在しないファイル)がどんどん増えていく可能性がある。だが/mirオプションを付ければ、それを抑止できる。robocopyを単なるバックアップ用途で利用するなら、このオプションが便利だろう。

 実行すると次のようになる。

/mirによるフォルダの完全同期 /mirによるフォルダの完全同期
/mirオプションを付けると、ファイルとサブフォルダをコピーするだけでなく、コピー先にのみ存在するファイル(EXTRA File)を削除する。

●ドライブ間のミラーコピーに注意

【2017/12/04追記】
 /mirオプション(もしくは/purgeオプション)を使う場合、2つのドライブ全体をコピーさせるなら注意が必要である。例えばG:の内容をすべてH:にコピーするなら、次のようなコマンドを実行するだろう(/zもしくは/zbオプションは、ユーザーのアクセス権がないファイルもバックアップするためのオプション)。

※問題のあるドライブ間コピーのコマンド

robocopy g:\ h:\ /mir /zb



 これを実行すると、H:のルートにある「\System Volume Information」というフォルダの内容をいったん削除してG:\からコピーしてきたファイルで上書きしようとする。だがこのフォルダには、各ボリュームごとの重要なメタデータ(ボリュームシャドウコピーや復元、重複除去機能などのデータ)が保存されているので、これを削除・上書きすると、ファイルシステム上のデータが壊れるなどの障害が発生することがある。

 これを避けるには、ドライブのルートをミラーコピーする場合には、System Volume Informationフォルダを除外するように/xdオプションも指定する。

※正しいドライブ間コピーのコマンド

robocopy g:\ h:\ /mir /zb /xd "System Volume Information"



 詳細については以下のページを参照していただきたい。

ログの保存

 以上の例のように、robocopyを実行すると、デフォルトではコピーしているファイルの状況や転送量、何ファイルコピーしたかなど、詳細なコピーの状況が画面に表示される。「コピー済み」が実際にコピーした数、「Extras」は/mir/purgeオプションによって削除された数である。

 このログはファイルなどに残すこともできるので、タスクスケジューラに登録して自動実行する場合でも、後で実行状況を確認でき、便利である。ログをファイルに残すには「/log」オプションを指定する。

ログオプション ログオプション
/logオプションを使うと、robocopyのコピー結果のログを残しておける。タスクスケジューラで自動実行させる場合は、このオプションを使えば動作結果を後で確認できる。

 /log以外にも、幾つかのログオプションが利用できる。

オプション名 意味
/log:<ファイル名> 指定したファイルにログを書き込む。ファイルが存在する場合は、既存の内容は破棄され、新規作成される
/log+:<ファイル名> 指定したファイルの末尾にログを追加する
/tee ログファイルに出力するとともに、画面にも表示する
主なログ出力オプション

robocopyのオプションをジョブとして登録・保存する

 robocopyで何度も同じコピー作業を繰り返すつもりなら(バックアップタスクとして登録する場合など)、robocopyで行う作業を「ジョブ」として用意しておくとよいだろう。

 「/save」オプションを使うと、robocopy実行時に指定したフォルダやパターン指定、オプション設定などがジョブとして.RCJファイルに保存される。保存された.RCJファイルを「/job」オプションで呼び出すことにより、同じコマンドを再実行できる。

robocopyジョブ robocopyジョブ
robocopyのパラメーターとして指定したコピー元やコピー先情報、オプション指定などをジョブファイル(.RCJファイル)として保存しておくと、以後は、ジョブファイルを指定するだけで同じ動作を行わせることができる。

 /saveオプションを付けると、その左側にあるすべてのパラメーターが指定した.RCJファイルに書き込まれる。.RCJファイルはテキストファイルなので、メモ帳などで開けば、オプション設定を変更できる。

 なお/saveオプションだけだと、/saveによる保存後に、指定したパラメーターでrobocopyが1回実行される(コピーが行われる)。コピーさせずに.RCJファイルの作成だけを行いたい場合は、最後に「/quit」オプションを付加すること。

※ジョブの定義例
robocopy c:\src d:\dest /mir /save:copyjob /quit

※ジョブの実行例
robocopy /job:copyjob



[補足]GUIで使うRichcopy

 コマンドラインではなくGUIのツールでフォルダをバックアップしたり同期したりしたい場合は、Richcopyが利用できる。詳細は次の記事を参照していただきたい。

■更新履歴

【2017/12/04】2つのドライブ間でのミラーコピーに対する注意事項を追記しました。

【2017/11/29】Windows 10/Windows Server 2016に合わせて、内容を更新しました。

【2015/02/25】Windows 8/8.1およびWindows Server 2012/2012 R2に同梱のrobocopyコマンドの情報を反映しました。

【2011/06/24】robocopyの基本的な使い方を追記しました。またWindows 7/Windows Server 2008 R2で標準装備されたrobocopyコマンドをベースに加筆修正をしました。

【2007/04/20】初版公開(対象はWindows 2000/Windows XP/Windows Server 2003/Windows Vista)。


Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。