2017年9月22日金曜日

ROBOCOPY の除外オプションの挙動を検証してみた。

序文

近年の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 :: コピー先より新しいコピー元ファイルを除外します。
だったなら、もう少し親切だったように思う)

なお、英語版のヘルプにもあいまいなところ(説明不足による複数の解釈の余地)があり、あまりわかりやすいとは言えない。日本語翻訳チームも苦労したのかもしれない。

0 件のコメント :

コメントを投稿