n-Archives.net

Robocopyコマンド: /DCOPY:DATのすすめ

目次

フォルダをコピーするとフォルダのタイムスタンプが失われる

もうこれは以前からずっと言われていることですが、Windowsのエクスプローラでのフォルダのコピー(複製)では、フォルダのタイムスタンプが失われてしまいます。

念のため、改めて、自分のテスト環境でやってみたところ、確かにそうなりました。が、必ずしもタイムスタンプが失われるということではないようで、少し余談になりますが、私が実験してみて分かった結果を以下にまとめます。

エクスプローラでコピーした時のタイムスタンプ
  • ファイル → タイムスタンプは維持される
  • 配下にファイルやフォルダが存在するフォルダ → タイムスタンプはコピーした日付に更新される
  • 配下にファイルやフォルダが存在しないフォルダ → タイムスタンプは維持される

ほとんどの場合、フォルダ配下には何らかのファイルやフォルダがあると思うので、コピーすると日付が変わってしまうということになります。

どうやら、エクスプローラの内部処理では、フォルダをコピーした瞬間は元のタイムスタンプを維持しているようですが、その配下にファイルやフォルダをコピーした際に、タイムスタンプが更新されてしまうようです。

世の中で使われているバックアップツールにも、フォルダのタイムスタンプが更新されてしまうものがあるようですが、いずれにしても、「データのバックアップ」という以上、フォルダのタイムスタンプも維持しておきたいところです。

 

robocopyには必ず/DCOPY:DATを付ける

というわけで、フォルダのタイムスタンプを維持するため、私は、robocopyには必ず /DCOPY:DAT オプションを付けるようにしています。本サイトのコマンド例にもほとんどこのオプションを付けています。/DCOPY:DATは付けておくよう、お勧めしたいです。

しかし、インターネットを調べていると、/DCOPY:DAT ではなく、/DCOPY:Tを付けるとしているケースも多く見かけます。実際のところ、/DCOPY:DAT と /DCOPY:Tはどのように違い、どちらを使うべきなのでしょうか。

 

/DCOPYオプションの挙動について調べてみる

それでは、/DCOPYオプションのD、A、Tフラグは、それぞれどのような意味があるのでしょうか。また、それらの挙動はどのようなものなのでしょうか。

 

D(データ)フラグ

/DCOPYのDフラグは、代替データストリーム(Alternate Data Stream)をコピーするかどうかを指定します。代替ストリームとは、ファイルまたはフォルダに副次的なデータを付加するための仕組みです。よくあげられる例としては、インターネットからファイルをダウンロードしたときに、ダウンロードしたファイルに、ダウンロード元のIPアドレスやURLを記した「Zone.Identifier」という名前の代替データストリームが付加されます。

フォルダにも代替ストリームは付加できます。フォルダの代替ストリームもコピーするかを指定するのがDフラグということになります。

Dフラグの挙動について簡単に調べてみました。

/DCOPY:Dのコピー先のフォルダへの影響(個人調べ)
コピーフラグ 有無 フォルダ新規作成時 フォルダ更新時
D (データ) あり 代替データストリームはコピーされる。 代替データストリームはコピーされない。
なし 代替データストリームはコピーされない。 代替データストリームはコピーされない。

コピー先に新規にフォルダが作成される場合は、Dフラグが付いていれば、代替データストリームがちゃんとコピーされていました。が、コピー先にすでにフォルダが存在している時には、Dフラグを付けても代替データストリームはコピーされませんでした。もしかするとバグかなという気もします。

実際には、フォルダに代替データストリームが設定されていることはあまりないのではないかと思われますので、Dフラグを付ける意味は、実質、あまりないかもしれません。逆に、ウィルスやトロイの木馬などに利用されるともいわれており、指定しないほうが良いという考え方もあると思います。

代替データストリームについて初めての方は、以下記事をご覧ください。

 

A(属性)フラグ

/DCOPYのAフラグは、「拡張ファイル属性」をコピーするかどうかを指定するものです。「拡張ファイル属性」とは、代替データストリームと同じように、ファイルやフォルダに付加できるファイル属性だということです。

ファイル属性には、大きく、DOS-style 属性(DOS-style attributes)、と、拡張ファイル属性の2つに分けられます。

DOS-style 属性という表現は、Microsoft のドキュメントの中で使われている表現です。Archive, Hidden, System, Read-only など、Windowsのファイルシステムとして定義された属性のことを指します。通常、「ファイル属性」というと、このことを指しますね。この記事の中では、DOS-style属性のことを(拡張ファイル属性と区別するため)基本ファイル属性と呼ぶことにします。

一方、拡張ファイル属性は、任意に設定できる属性だということです。ただ、この拡張ファイル属性は、主に他OSとの互換性のためのもので、現在ほとんど使用されていないのではないかと言われています。

Microsoftのドキュメントにも、「ディレクトリのファイル属性(基本ファイル属性)に依存したアプリケーションはほとんど見かけないので、拡張ファイル属性を使用するアプリケーションを使用していないのであれば、Aフラグは付けなくても問題ない」、と書かれており、実質的に Aフラグは付けなくても問題はなさそうです。

(拡張ファイル属性に対するrobocopyの挙動については私自身では調査できていません。)

 

T(タイムスタンプ)フラグ

Tフラグの挙動についても試してみました。

/DCOPY:Tオプションのコピー先のフォルダへの影響(個人調べ)
コピーフラグ 有無 フォルダ新規作成時 フォルダ更新時
T (タイムスタンプ) あり コピー元のタイムスタンプになる。 コピー元のタイムスタンプになる。
なし コピー元のタイムスタンプになる。 フォルダ配下に存在するファイル・フォルダが新規作成、削除、リネームされた場合、フォルダのタイムスタンプがコピー実施時刻に更新される。
フォルダ配下のファイルが編集されただけの場合は、タイムスタンプは更新されない。

Tフラグがついていれば、常に、コピー元のフォルダのタイムスタンプがコピーされることが確認できました。意外なことに、新規コピーの時にはTフラグが無くても全てのフォルダで元タイムスタンプがコピーされるという結果になりました。

一方、コピー先にすでにフォルダが存在している場合、Tフラグを指定していないと、コピー時のタイムスタンプがフォルダについてしまうことがあります。フォルダ配下のファイルやフォルダを新規作成、削除、リネームした場合、タイムスタンプがコピー実施時刻(コピー元フォルダのタイムスタンプではない)になってしまいます。しかし、配下のファイルが「編集」されただけだと、フォルダのタイムスタンプは書き変わりません。やはり、この挙動はあまり直感的に理解しがたいですね。

タイムスタンプがどう設定されるのか分からなくなりますので、やはり、Tオプションは指定しておくべきでしょう。

 

フォルダの基本ファイル属性に対する挙動

/DCOPYのD, A, Tフラグについては上記に説明した通りなのですが、通常使われる、Archive, Hidden, System, Read-only などの「基本ファイル属性」については、何も触れられていませんでした。それでは、この「基本ファイル属性」はどのように扱われるのでしょうか。実験してみた結果を以下に示します。

フォルダの基本ファイル属性のコピーの挙動(個人調べ)
コピーフラグ フォルダ新規作成時 フォルダ更新時
/DCOPY:D 基本ファイル属性はコピーされる 常に基本ファイル属性はコピーされる
/DCOPY:A 基本ファイル属性はコピーされる 常に基本ファイル属性はコピーされる
/DCOPY:T 基本ファイル属性はコピーされる 常に基本ファイル属性はコピーされる
/DCOPY:DA(デフォルト) 基本ファイル属性はコピーされる 常に基本ファイル属性はコピーされる
/NODCOPY 基本ファイル属性はコピーされない 基本ファイル属性はコピーされない

少し意外に感じますが、/DCOPYをどのようなフラグで指定しても、基本ファイル属性は必ずコピーされます。配下のファイルやフォルダが更新されたときだけでなく、常にコピーされています。/DCOPYオプションは、Archive, Hidden, System, Read-only などの基本ファイル属性とは全く無関係だったんですね。これって、ほとんどの人が誤解しているんじゃないでしょうか。

なお、参考に、/NODCOPYオプションを付けた場合、基本ファイル属性はコピーされませんでした。代替データストリーム、拡張ファイル属性がコピーされないだけでなく、基本ファイル属性もコピーされません。基本ファイル属性をコピーしたくない場合は、/DCOPYオプションではなく、/NODCOPYオプションを使う必要があるということになりますね。

 

/NODCOPYオプション

/DCOPYオプションの D, A, T いずれも指定したくない場合に、/NODCOPYオプションを使う。ということなのですが、上述したように、代替データストリーム、拡張ファイル属性、タイムスタンプがコピーされないだけでなく、基本ファイル属性もコピーされなくなる点に注意が必要です。

Microsoftのドキュメントによれば、コピー速度を最大限に向上したければ、/NODCOPYを指定するとよい、と書かれてます。もちろん、代替データストリーム、拡張ファイル属性、タイムスタンプもコピーされませんが。

 

結論

  • より完全に情報をコピーしておくためには、/DCOPY:DAT を付ける。
  • 通常、フォルダの代替データストリームや拡張ファイル属性は使われていないようなので、/DCOPY:T でも問題なさそう。
  • セキュリティ対策等の理由で、代替データストリームをコピーしない場合、/DCOPY:T とする。
  • フォルダの基本ファイル属性(Archive, Hidden, System, Read-only等)をコピーしない場合 /NODCOPYを使う。

 

参考リンク

 

改訂履歴

・ 2020/1/11 拡張ファイル属性、基本ファイル属性に関する内容を大幅追記

 



【関連記事・関連コンテンツ】

 

コメントをお送りください
お名前:
コメント:
コメントの公開: