robocopyまとめ

転送元のファイル・フォルダを全く同じ状態で転送先にコピーしたい。 データだけじゃなくて、タイムスタンプとかACLも同じにしたい。 転送元は日々更新される。 転送先は更新されない。 転送元のファイル容量が大きいので、最初に全データコピーした後は、ミラーリングを繰り返す。

  • コマンド

コピー
robocopy 転送元 転送先 /COPYALL /E /FP /Z /NP /TS /R:0 /LOG:C:\log.txt
ミラーリング
robocopy 転送元 転送先 /COPYALL /MIR /E /FP /Z /NP /TS /R:0 /LOG:C:\log.txt
リスト(フォルダ・ファイル名、タイムスタンプ(更新日時のみ)、サイズ)
robocopy 転送元 空フォルダ /L /E /FP /Z /NP /TS /NC /R:0 /LOG:C:\log.txt

  • コマンドオプション

/L : ファイルのリストを表示するのみ。ファイルのコピーなどはしない。
/E : 空のサブフォルダも含めてコピーする。
/Z : 再開可能(restartable)モードでファイルをコピーする。
/R:n : コピーに失敗したときにリトライする回数。デフォルト1000000。
/FP : ログ出力にファイルのフルパス名を含める。
/NP : 進捗を表示しない(%コピーという表示をしない)。
/TS : ログ出力にソースファイルのタイムスタンプを含める。
/NS : ファイルサイズをログに出力しない。
/NC : ログにファイルクラス(New File,Newer,Olderなど)を出力しない。
/LOG:file : ログファイルに出力する。存在するファイルには上書き。
/MIR : ミラーリングコピーする。(/Eと/PURGEを指定したのと同じ)
/PURGE : コピー元にないファイル・フォルダを削除する。
/COPYALL : すべてのファイル情報をコピーする。(/COPY:DATSOUと同じ)
/COPY:copyflag : copyflagで指定されたファイル情報をコピーする(デフォルトは/COPY:DAT)
 D:データ A:属性 T:タイムスタンプ S:セキュリティ情報(NTFSACL) O:所有者情報 U:ファイル監査情報

  • 考察

/Zをつけるとパフォーマンスが低下するとの情報あり(robocopyマニュアルより)。/Zの意味がよく分からない。
/R:0がないと、失敗したときにデフォルトで100万回リトライして時間がかかる。
/COPYALLまたは/COPY:Aを指定しても、コピーされる属性は、読み取りR、アーカイブA、システムファイルS、隠しファイルHの4つだけ(たぶん)。 圧縮C、非インデックス対象N、暗号化E、テンポラリT、オフラインO属性は、コピーされない(たぶん)。
/COPYALLまたは/COPY:Tを指定してコピーされるタイムスタンプは、作成日時、更新日時、アクセス日時の3つ全部。 ログで表示されるタイムスタンプは、更新日時のみ。 更新日時は世界協定時刻(UTC)で表示されるため、ローカル時刻と9時間ずれている。
robocopyはファイルの存在(転送元、転送先、両方)、タイムスタンプ(更新日時のみ)、サイズでファイルをクラスに分類し、デフォルトで以下の4つのクラスのファイルをコピーする。
 Lonely(転送元にあって転送先にない)
 Changed(転送元先両方にある、更新日時一致、サイズが違う)
 Newer(転送元先両方にある、転送元の更新日時が転送先より新しい)
 Older(転送元先両方にある、転送元の更新日時が転送先より古い)
デフォルトでは属性の違いは見ない。/ITつけると、属性の違いでさらに2つのクラスに分類されて、Tweakedもコピーされるようになる。
 Same(転送元先両方にある、更新日時一致、サイズ一致、属性一致)
 Tweaked(転送元先両方にある、更新日時一致、サイズ一致、属性違う)

  • 問題

1.
圧縮属性(NTFS圧縮)がコピーされないので、転送元でNTFS圧縮されているデータは、転送先ではNTFS圧縮されず、転送元より転送先の方が容量が増える可能性がある。
【圧縮属性の確認方法】
フォルダのプロパティ→全般→詳細設定→属性の詳細→「内容を圧縮してディスク領域を節約する」がオンなら圧縮されている
ちなみに、これがオンだとエクスプローラの表示が青字になる

2.
ACLだけが変わったファイルは、前述のコマンドだとコピーされない。
ACLを変えると、アクセス日時が変わるけど、更新日時とサイズが変わらないので、デフォルトではコピー対象にならない。
ミラーリング後に「/COPY:S」でACLだけコピーすれば大丈夫?(←まだ試してない)

  作成日時 更新日時 アクセス日時
copy コピー時 保持 コピー時
move 保持 保持 移動時
ACL変更 保持 保持 変更時
robocopy /COPY:DAT 保持 保持 保持

3.
転送先に、転送元のファイル名と同じ名前の8.3形式ファイル名を持つファイルがあると、上書きされてしまう。
例えば、
 file1:新規テキスト.txt(新規~2.TXT)
 file2:新規~1.TXT(なし)
robocopyでコピーする場合、(※()の中は8.3形式ファイル名)
まずfile1がコピーされてこうなる。
転送元
 file1:新規テキスト.txt(新規~2.TXT)
 file2:新規~1.TXT()
転送先
 file1':新規テキスト.txt(新規~1.TXT)
8.3形式ファイル名はOSが勝手につけるので、転送元と同じになるとは限らない。
次にfile2がコピーされる。けど、同じ8.3形式ファイル名のファイルfile1'があるので上書きしてしまう。
転送元
 file1:新規テキスト.txt(新規~2.TXT)
 file2:新規~1.TXT()
転送先
 file2':新規テキスト.txt(新規~1.TXT)
名前はfile1と同じだけど、中身はfile2になっている。

これはxcopyでやっても同じことになる。手動でエクスプローラでドラッグ&ドロップした場合だけ、上書きせずに正常にコピーされる。 robocopyでコピー後は、毎回確認して足りないファイルは手動でコピーしないといけないのか?