序文
近年のWindowsに標準搭載されている ROBOCOPY (高機能なファイルコピーコマンド) について、ヘルプを見ただけではわかりにくい細部の挙動 (除外オプション回り) を検証してみた。
※検証は Windows 7 でしか行っていないため、Windows 10 などでは挙動が異なる可能性あり。
補足: ROBOCOPYを使用する上で、認識しておいた方がよい挙動
ROBOCOPYは、ファイルの更新判定を、メタ情報 (更新日時とファイルサイズ) だけで行っている。→ ファイルの中身は比較していない。
これは、コピー速度を上げるための有効な戦略で、ほとんどの場合で問題は出ない。
例外として、もし(パワーユーザが特殊な操作で)ファイルの更新日時を操作していると、ROBOCOPYがファイルの更新に気づけないケースが発生しうる。
検証環境
- Windows 7 Professional (SP1) 64bit版、日本語
- コマンドプロンプトのコードページ: 932 (Shift-JIS) と 65001 (UTF-8)
検証結果
検証結果を表にまとめてみたものの、ROBOCOPY にある程度慣れている人にしか伝わらないかもしれない。
No. | ファイル有無 | 更新日時 | サイズ | 中身 | 表示 | 除外オプション |
1 | コピー先 のみ | - | - | - | 「*EXTRA File 」 | /XX |
2 | コピー元 のみ | - | - | - | 「New File 」 「新しいファイル」 | /XL |
3 | 両方に存在 |
同一日時 | 同一サイズ | 同じ | 「Same 」 「同じ」 | (デフォルトで 除外される) |
4 | 異なる |
5 | 別サイズ | - | 「Changed 」 「変更済み」 | /XC |
6 | コピー元が新しい | 同一サイズ | 同じ | 「Newer 」 「より新しい」 | /XN |
7 | 異なる |
8 | 別サイズ | - |
9 | コピー元が古い | 同一サイズ | 同じ | 「Older 」 「より古い」 | /XO |
10 | 異なる |
11 | 別サイズ | - |
No. | ファイル有無 | 更新日時 | サイズ | 中身 | 表示 (「/XL /V 」指定時) |
2 | コピー元 のみ | - | - | - | 「lonely 」 「コピー元にだけ存在する」 |
一言コメント
- 検証の結果分かったこと: 「
/XC
」の「Changed」(変更された/変更済み) というのは、
「ファイルサイズが変更されていて、更新日時が変更されていない」という意味だった。
このオプションを単独で使う状況が思いつかない。
- コピー元だけに存在するファイルのみをコピーしたいとき (= 両方に存在するファイルは無視したいとき) には、「
/XC /XN /XO
」を指定すればよい。
- 除外オプションを試行錯誤するときには、あわせて「
/V
」オプションも指定しておくと捗る。
- ROBOCOPYをコピー実行中に Ctrl+C で強制停止させた場合、コピー先にコピー途中の不完全なファイル(更新日付が1980年のファイル)が残るので、適宜手作業で取り除くこと。
読み物 (1): ROBOCOPYの画面表示について
ROBOCOPY を コードページ 65001 で実行すると、きわめて整然とした画面出力がされる。(図1)
非常に見やすく、わかりやすい。
図1. chcp 65001: きわめて整然でわかりやすい
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Thu Sep 21 07:21:20 2017
Source : T:\srcDir\
Dest : T:\dstDir\
Files : *.*
Options : *.* /V /L /COPY:DAT /R:1000000 /W:30
------------------------------------------------------------------------------
10 T:\srcDir\
*EXTRA File 6 dstExtra.txt
same 6 same.txt
same 6 sameTime_diffContent_sameSize.txt
Changed 6 sameTime_diffContent_diffSize.txt
New File 6 srcLonely.txt
Newer 7 srcNewer_diffContent_diffSize.txt
Newer 6 srcNewer_diffContent_sameSize.txt
Newer 6 srcNewer_sameContent.txt
Older 6 srcOlder_diffContent_diffSize.txt
Older 6 srcOlder_diffContent_sameSize.txt
Older 6 srcOlder_sameContent.txt
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 1 0 1 0 0 0
Files : 10 8 2 0 0 1
Bytes : 61 49 12 0 0 6
Times : 0:00:00 0:00:00 0:00:00 0:00:00
Ended : Thu Sep 21 07:21:20 2017
しかしながら、我々の コードページ 932 (日本語Windows環境のデフォルト) では、画面表示の桁がそろっておらず、見づらい。(図2)
日本語翻訳チームさんたちには、もう少し頑張ってもらいたかった。
図2: chcp 932: 桁合わせがうまくいっておらず、わかりづらい。
-------------------------------------------------------------------------------
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
開始: Thu Sep 21 07:21:20 2017
コピー元 : T:\srcDir\
コピー先 : T:\dstDir\
ファイル: *.*
オプション: *.* /V /L /COPY:DAT /R:1000000 /W:30
------------------------------------------------------------------------------
10 T:\srcDir\
*EXTRA File 6 dstExtra.txt
同じ 6 same.txt
同じ 6 sameTime_diffContent_sameSize.txt
変更済み 6 sameTime_diffContent_diffSize.txt
新しいファイル 6 srcLonely.txt
より新しい 7 srcNewer_diffContent_diffSize.txt
より新しい 6 srcNewer_diffContent_sameSize.txt
より新しい 6 srcNewer_sameContent.txt
より古い 6 srcOlder_diffContent_diffSize.txt
より古い 6 srcOlder_diffContent_sameSize.txt
より古い 6 srcOlder_sameContent.txt
------------------------------------------------------------------------------
合計 コピー済み スキップ 不一致 失敗 Extras
ディレクトリ: 1 0 1 0 0 0
ファイル: 10 8 2 0 0 1
バイト: 61 49 12 0 0 6
時刻: 0:00:00 0:00:00 0:00:00 0:00:00
終了: Thu Sep 21 07:21:20 2017
読み物 (2): 除外オプションの挙動
ここでいう「除外オプション」とは、一部のファイルをバックアップ対象外とするためのオプションを意味する。 これらは、ROBOCOPYのコマンドラインオプション内の「ファイル選択オプション」(File Selection Options)グループに属している。
以下は、ROBOCOPYのコマンドラインヘルプからの抜粋である。(図3、図4)
図3: ROBOCOPYのコマンドラインヘルプ (日本語版) からの抜粋
/XC :: 変更されたファイルを除外します。
/XN :: 新しいファイルを除外します。
/XO :: 古いファイルを除外します。
/XX :: コピー先にだけ存在するファイルとディレクトリを除外し
ます。
/XL :: コピー元にだけ存在するファイルとディレクトリを除外し
ます。
/IS :: 同一ファイルを含みます。
/IT :: 異常なファイルを含めます。
図4: ROBOCOPYのコマンドラインヘルプ (英語版) からの抜粋
/XC :: eXclude Changed files.
/XN :: eXclude Newer files.
/XO :: eXclude Older files.
/XX :: eXclude eXtra files and directories.
/XL :: eXclude Lonely files and directories.
/IS :: Include Same files.
/IT :: Include Tweaked files.
とりあえず、日本語版のヘルプは、「ヘルプ上の文言」と「実際に画面表示される文言」とが一致してないため、非常にわかりづらい。わかりづらいというよりは、用語の混乱がある。
ROBOCOPYの概念上、「新しいファイル (New File/Lonely)」と「より新しい (Newer)」は全く別の意味をあらわす用語になっている。これが混乱の元である。
たとえば、「/XN
」というオプションの説明文として、
「/XN :: 新しいファイルを除外します。
」
とあるが、このオプションでは 画面上で「新しいファイル」と表示されるファイルは除外されない。このオプションで実際に除外されるのは、画面上で「より新しい」と表示されるファイルである。
「新しいファイル」と表示されるファイルを除外するには、「/XL
」を指定する必要がある。
(もし「/XN
」オプションの説明文が、
「/XN :: コピー先より新しいコピー元ファイルを除外します。
」
だったなら、もう少し親切だったように思う)
なお、英語版のヘルプにもあいまいなところ(説明不足による複数の解釈の余地)があり、あまりわかりやすいとは言えない。日本語翻訳チームも苦労したのかもしれない。