robocopy コマンドについて調べてみた

こんにちは。
クラウドインテグレーション部技術4課の山﨑です。
2016年の自転車の走行距離は約1600kmとなりました。2017年は2000kmくらいを目標に頑張ります。部活で大会に出たいなーと思っています。(ちらっ

さて、最近、WindowsServerのファイルのコピーにrobocopyを使う機会があったのですが、オプションが多く、何を使って良いのかわかりにくかったので、少しまとめてみました。

目次
1.robocopyとは
2.robocopyの基本構文とオプション
3.利用例

1. robocopyとは

御存じだと思いますが、robocopyはWindowsServer2008以降でOS標準搭載されたのコマンドの一つです。 
用途としては、ファイルサーバーの移行や、バックアップなどで使います。

例えば、robocopyでは、以下のようなことができます。
  • 256文字を超えるパス名のファイルのコピー(xcopyではエラーとなります)
  • 指定したバイト数よりも 大きい/小さい ファイルを除外
  • 指定した日付より 新しい/古いファイル を除外
  • 指定の属性ファイルの コピー/除外
  • コピーに失敗した場合のリトライ回数の指定
  • アクセス権、時刻情報、所有者情報等のコピー/除外
  • パターンに一致する ファイル/ディレクトリ の コピー/除外
  • 帯域を制限するための、パケット間のウェイト設定
robocopyには、紹介した以外にも沢山の機能があります。そのため、ファイルの移行やバックアップの際に環境に合った状態でファイルをコピーすることができます。
全ての機能は以下のリンクをご参照ください。  

Robocopy - TechNet - Microsoft

2.robocopyの基本構文とオプション

基本構文

基本構文

robocopy コピー元 コピー先 [ファイル [ファイル]...] [オプション]

コピー元 : コピー元のフォルダ名(共有フォルダも指定可能)
コピー先 : コピー先のフォルダ名(共有フォルダも指定可能)
ディレクトリがない場合は、自動で作成される
ファイル : コピーするファイル/フォルダ名
既定値は「*.*」  複数指定可能 ワイルドカードの利用も可能
オプション :  後述

オプション

代表的オプションだけ抜粋して記載しています。
太字にしたオプションは規定値があり、オプションを指定しない場合、規定値で実行されます。
<コピー オプション> 
/E : 空のディレクトリを含むサブディレクトリをコピーします。
/PURGE :  既にコピー元に存在しないコピー先のファイル/ディレクトリを削除します。
/MIR : ディレクトリ ツリーをミラー化します (/E および /PURGE と同等)
/COPY :コピーフラグ :: ファイルにコピーする情報 (既定値は /COPY:DAT)
    ( D= データ、A= 属性、T= タイムスタン、S= NTFS ACL、O= 所有者情報、U= 監査情報)。
/COPYALL : ファイル情報をすべてコピーします (/COPY:DATSOU と同等)。
/DCOPY :コピーフラグ :: ディレクトリにコピーする情報 (既定値は /DCOPY:DA)。
         (コピーフラグ: D= データ、A= 属性、T= タイムスタンプ)。
/IPG:n :: 低速回線で帯域幅を解放するためのパケット間ギャップ (ミリ秒)。

<ファイル選択オプション>
/XF file [ファイル]...  :  指定された名前/パス/ワイルドカードに一致するファイルを除外します。
/XD dir [ディレクトリ] : 指定された名前/パスに一致するディレクトリを除外します。
/XN : 新しいファイルを除外します。
/XO : 古いファイルを除外します。
/MAX:n : 最大ファイル サイズ - n バイトより大きいファイルを除外します。
/MIN:n : 最小ファイル サイズ - n バイトより小さいファイルを除外します。
/MAXAGE:n : 最長ファイル有効期間 - n 日より古いファイル更新日時のファイルを除外します。
/MINAGE:n : 最短ファイル有効期間 - n 日より新しいファイル更新日時のファイルを除外します。

<再試行オプション>
/R:n :
失敗したコピーに対する再試行数(n回): 既定値は 1,000,000回 。規定値のままだと、ファイルのエラーでリトライを繰り返しいつまでも終わらない場合があります。
/W:n : 再試行と再試行の間の待機時間(n秒): 既定値は、30 秒。

<ログ オプション>
/NP : 進行状況なし - コピーの完了率を表示しません。 10%,20%など進捗がログに出力されるとログが見づらくなるので、ログを出力する際はこちらのオプションを有効にすることをオススメします。

その他のオプションを確認したい場合は robocopy /? をコマンドプロンプトで実行するとヘルプを確認することができますので、ご参照ください。

3.利用例

いくつか利用例を記載します。
例1 オプション指定なし
コマンド : robocopy <コピー元> <コピー先>
オプションを指定していないので、全て規定値が適用され、コピーが実行されます。
コピー元ディレクトリ直下の子ファイルのみコピーされます。その際、子ディレクトリ以下のファイルやディレクトリはスキップされます。%e4%be%8b1
例2 全てのファイル/ディレクトリのコピー
コマンド : robocopy <コピー元> <コピー先> /MIR /COPYALL
アクセス権含めて全てファイル、ディレクトリのコピーをします。コピー元とコピー先が同様の状態になります。
/MIR を指定しているため、既にコピー元に存在しないコピー先のファイル、ディレクトリは削除されます。コピー先で新規にファイル等を作成した場合、上記コマンドを実行すると削除されるためご注意ください。
%e4%be%8b2
例3 拡張子を指定したコピー
コマンド : robocopy <コピー元> <コピー先> /MIR *.jpg

コピー元ファイル内の全てのJPGファイルをコピーします。
/MIR もしくは、/E を指定した場合、空のディレクトリ含めて、全てのディレクトリがコピーされます。
上記オプションを指定しない場合、コピー元ディレクトリ直下のJPGファイルのみコピーされます。
%e4%be%8b3
例4 パケット間のウェイト設定したコピー
コマンド : robocopy <コピー元> <コピー先> /MIR /COPYALL /IPG:100

例2のコマンドとコピー内容は同様ですが、100ミリ秒のパケットギャップを入れています。1ブロックコピーするごとに、100ミリ秒待機する設定となります。
制限前と制限後でどれだけ通信速度が変わったか確認してみました。

制限前の通信速度: 800 バイト/秒
制限後の通信速度: 7 バイト/秒

パケットギャップをいれることで、帯域を圧迫してしまうことは少なくなりますが、その分、コピーの時間が延びてしまうので、調整が必要ですね。
%e4%be%8b4
例5  最大ファイル サイズを指定したコピー
コマンド:robocopy  <コピー元> <コピー先> /MIR /COPYALL /MAX:102400000

こちらも例2のコマンドとコピー内容は同じですが、コピーするファイルの最大サイズを100MBとしています。
100MBを超えるファイルについてはスキップされます。
%e4%be%8b5

最後に

robocopyは、オプションが多いので、最初はとっつきにくいですが、オプションをある程度理解すると、細かいコピーの制御ができてすごく便利です。また、robocopyだけでは、帯域の制御まではできないのですが、windowsのグループポリシーの機能でアウトバウンドの帯域制御ができるので、robocopyと組み合わせて使うことで、帯域を圧迫せずファイルの移行やバックアップができます。
グループポリシーによる、アウトバウンドの帯域制御の方法につきましては、以下のリンクをご参照ください。   robocopyのオプションの多さに困っている方の参考になりましたら、幸いです。

※2017年1月23日 追記  
WindowsServerでの通信制御についてブログを書きました。 
WindowsServer2016でアウトバウンドの帯域制御

AWS運用自動化サービス「Cloud Automator」無料トライアルはこちらから

COMMENT ON FACEBOOK