もうこれは以前からずっと言われていることですが、Windowsのエクスプローラでのフォルダのコピー(複製)では、フォルダのタイムスタンプが失われてしまいます。
念のため、改めて、自分のテスト環境でやってみたところ、確かにそうなりました。が、必ずしもタイムスタンプが失われるということではないようで、少し余談になりますが、私が実験してみて分かった結果を以下にまとめます。
ほとんどの場合、フォルダ配下には何らかのファイルやフォルダがあると思うので、コピーすると日付が変わってしまうということになります。
どうやら、エクスプローラの内部処理では、フォルダをコピーした瞬間は元のタイムスタンプを維持しているようですが、その配下にファイルやフォルダをコピーした際に、タイムスタンプが更新されてしまうようです。
世の中で使われているバックアップツールにも、フォルダのタイムスタンプが更新されてしまうものがあるようですが、いずれにしても、「データのバックアップ」という以上、フォルダのタイムスタンプも維持しておきたいところです。
というわけで、フォルダのタイムスタンプを維持するため、私は、robocopyには必ず /DCOPY:DAT オプションを付けるようにしています。本サイトのコマンド例にもほとんどこのオプションを付けています。/DCOPY:DATは付けておくよう、お勧めしたいです。
しかし、インターネットを調べていると、/DCOPY:DAT ではなく、/DCOPY:Tを付けるとしているケースも多く見かけます。実際のところ、/DCOPY:DAT と /DCOPY:Tはどのように違い、どちらを使うべきなのでしょうか。
それでは、/DCOPYオプションのD、A、Tフラグは、それぞれどのような意味があるのでしょうか。また、それらの挙動はどのようなものなのでしょうか。
/DCOPYのDフラグは、代替データストリーム(Alternate Data Stream)をコピーするかどうかを指定します。代替ストリームとは、ファイルまたはフォルダに副次的なデータを付加するための仕組みです。よくあげられる例としては、インターネットからファイルをダウンロードしたときに、ダウンロードしたファイルに、ダウンロード元のIPアドレスやURLを記した「Zone.Identifier」という名前の代替データストリームが付加されます。
フォルダにも代替ストリームは付加できます。フォルダの代替ストリームもコピーするかを指定するのがDフラグということになります。
Dフラグの挙動について簡単に調べてみました。
コピーフラグ | 有無 | フォルダ新規作成時 | フォルダ更新時 |
---|---|---|---|
D (データ) | あり | 代替データストリームはコピーされる。 | 代替データストリームはコピーされない。 |
なし | 代替データストリームはコピーされない。 | 代替データストリームはコピーされない。 |
コピー先に新規にフォルダが作成される場合は、Dフラグが付いていれば、代替データストリームがちゃんとコピーされていました。が、コピー先にすでにフォルダが存在している時には、Dフラグを付けても代替データストリームはコピーされませんでした。もしかするとバグかなという気もします。
実際には、フォルダに代替データストリームが設定されていることはあまりないのではないかと思われますので、Dフラグを付ける意味は、実質、あまりないかもしれません。逆に、ウィルスやトロイの木馬などに利用されるともいわれており、指定しないほうが良いという考え方もあると思います。
代替データストリームについて初めての方は、以下記事をご覧ください。
/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 (タイムスタンプ) | あり | コピー元のタイムスタンプになる。 | コピー元のタイムスタンプになる。 |
なし | コピー元のタイムスタンプになる。 | フォルダ配下に存在するファイル・フォルダが新規作成、削除、リネームされた場合、フォルダのタイムスタンプがコピー実施時刻に更新される。 フォルダ配下のファイルが編集されただけの場合は、タイムスタンプは更新されない。 |
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オプションを使う必要があるということになりますね。
/DCOPYオプションの D, A, T いずれも指定したくない場合に、/NODCOPYオプションを使う。ということなのですが、上述したように、代替データストリーム、拡張ファイル属性、タイムスタンプがコピーされないだけでなく、基本ファイル属性もコピーされなくなる点に注意が必要です。
Microsoftのドキュメントによれば、コピー速度を最大限に向上したければ、/NODCOPYを指定するとよい、と書かれてます。もちろん、代替データストリーム、拡張ファイル属性、タイムスタンプもコピーされませんが。
・ 2020/1/11 拡張ファイル属性、基本ファイル属性に関する内容を大幅追記
RoboSync: RobocopyのためのGUIツール
本サイトで公開しているツールです。ダウンロードはこのバナーをクリック!
Version 1.3.27 をリリースしました! (2021/1/1)
RobocopyをGUIから実行できるようにするツールです。コマンドプロンプトを表示することなく、GUI画面からほぼマウス操作だけで実行までできます。
Robocopyがバックグラウンドでそのまま実行されますので設定に迷うことはありません。
・ 複数のコピー項目の作成と管理。
・ スクリプトファイル(バッチファイル)出力が可能。スケジューラによるバックグラウンド処理にも使えます。
・ Robocopyによるコピー実行前に、実行プレビュー(/L)、パラメータのチェック(/QUIT)が可能。
・ Robocopyのパラメータ設定の簡易チェック、Robocopy実行前の簡易チェックを行います。
・ Robocopy実行前後で実行するスクリプトを定義可能。
・ Robocopy実行途中での中断、実行ログの履歴管理と保存が可能。
【関連記事・関連コンテンツ】