Windowsのコピー機能と言えば、みんな大好きxcopy
でもxcopyは弱点をかかえていました。
- xcopy
- リトライ機能がない
- ネットワークが瞬断すると停止
- 大量ファイルを扱うと異常停止する可能性がある
- 途中でエラーがあると終了しやすい
- パス長制限に弱い
- シングルスレッド
- リトライ機能がない
それがrobocopyになった
そんなxcopyの弱点を克服するため、
Windows Vistaからデフォルト実装されたのがrobocopyです。
- robocopy
- xcopyより差分比較が高速 (タイムスタンプ+サイズ比較)
- リトライ機能がある
- ネットワークが瞬断されても継続
- 数十万~数百万ファイルを前提とした設計
- エラーをカウントしながら突き進む (もちろんログは出る)
- パス長制限に強い
- 除外フォルダと除外ファイルの設定が柔軟 (/XD, /XFオプション)
- マルチスレッド機能がある (/MTオプション)
- ミラーリング機能がある (/MIRオプション)
コピーも高速。大量ファイルの扱いも安定。サーバ間のコピーも安定。
xcopy、今までありがとう。
FastCopy
最強のコピーツールであるFastCopyを知っている人なら、
robocopyの良さが分かりやすいと思います。
速度はFastCopyの方が上みたいですが、
リトライ可能なrobocopyも強いし、何よりバッチに組み込みやすいのが利点。
robocopyの使い方
堅牢だという触れ込みはあるものの、業務に落とし込むことはないかも知れません。
ほとんどの場合は速いxcopyが欲しいだけだと思います。
何も考えずに、これを打てばオッケーです。
robocopy "コピー元" "コピー先" /E /R:0 /W:0 /NJH /NDL /NFL /NJS
除外対象は/XDや/XFで適宜入れてください。
robocopy "コピー元" "コピー先" /XD .git /XF *.bak /E /R:0 /W:0 /NJH /NDL /NFL /NJS
オプション説明
必要オプション
- /E : サブディレクトリを含める
追加オプション
- /XD : 除外フォルダ指定 (複数指定の場合はスペース区切り) (例:
/XD .git node_modules) - /XF : 除外ファイル指定 (複数指定の場合はスペース区切り) (例:
/XF *.bak *.tmp)
おまじない (高速化)
- /R:0 : 失敗時のリトライ回数0 (サーバ間でなければ不要)
- /W:0 : リトライ時の待ち時間0 (サーバ間でなければ不要)
- /NJH : ログにヘッダ情報を表示しない
- /NDL : ログにディレクトリ名を表示しない
- /NFL : ログにファイル名を表示しない
- /NJS : ログに集計情報を表示しない (欲しいときは外してもいい)
同期機能
- /MIR : 同期化
もちろんファイル削除も行うので注意。
全削除してコピーし直すくらいならこれを使う。
ただし注意点として、サイズが同じかつコピー先の更新日時が新しいと上書きしないという特性があります(後述)
マルチスレッド機能
- /MT : マルチスレッド化 (例:
/MT:8) (8スレッドが無難)
小さいファイルが膨大なときに真価を発揮する。
ログを全部出してファイル一覧とにらめっこしたい場合は外す。
順次実行じゃないとファイル一覧が順番に出ないので。
robocopyがコピー先にある「新しいファイル」を上書きするかどうかのまとめ
- コピー先の更新日時は新しいが、サイズが違う : 上書きコピーされる
- コピー先の更新日時が新しい、かつサイズが全く同じ場合 (奇跡) : 上書きコピーされない
-
/MIRも上記と同じ挙動 (奇跡が起きると完全一致しない) -
/ISをつければ問答無用で上書きコピーされる (でも差分コピーではなくなるので遅い) - 「100%の同期」は
/MIR /ISが必要 (コピー先をいじらなければもちろん/MIRでOK)
さいごに
"robocopy.bat"という名前のバッチを作らないように気を付けてください。
robocopyを呼ぼうとして同名の自分を呼んでしまい、再帰呼び出しになります。
一回やってしまった。別にマシンが落ちたりはしないけど。