2017年4月16日日曜日

PC Robocopy 階層上位のタイムスタンプを合わせる

Robocopy で階層上位の日付を同期させる方法です。
階層下位なら、 /DCOPY:T で済むのですが、
階層上位は、 存在しない場合、実行した日付で ディレクトリ(フォルダ) が新規作成されます。
これを、元の日付に替えたい!。


ディレクトリ(フォルダ)の階層を考えた時、
そのタイムスタンプで更新の有無を確認したり、と皆さんも良くなさると思います。

最上階層から全てを対象に処理する場合、今回の件は問題にはなりません。
そう、 オプションの /DCOPY:T で事足りてしまうからですね。
でも、 階層の途中に、暫定的な 或いは 試験的な ものが紛れ込むケースもあります。
そんな時は、その階層(フォルダ)を避ける形で 実行なさると思います。
勿論、オプションの中には、 除外 を扱うものもあるので、
最初から、それを利用した 処理 をしていれば、冒頭の件は回避出来ます。

しかし、膨大な数のファイルを転送してしまった後で、その上層階のフォルダの日付が 実行日 になっているのに気づく場合もあります。

分かり辛いかも知れないので、例を示しましょう。
  注: コマンドラインをコピペすると  ¥ 表示は正常ですが、処理が狂う場合があります。  ¥ 部分を打ち換えて下さい。.

D:\Folder1\Folder2\Folder3 配下のファイルを E:\Folder11\Folder2\Folder3 に収めるとしましょうか。
コマンドラインは Robocopy D:\Folder1\Folder2\Folder3 E:\Folder11\Folder2\Folder3 /S /DCOPY:T となります。 
Folder3 以下は /DCOPY:T のお陰で 日付は同期されていますね。
ここで、 Folder2 が E:\Folder6\ になかったとします。
Robocopy は このフォルダが転送先に存在しないので 新規に作成します。
この時の日付は 実行日(日時)になります。
/DCOPY の対象は 指定されたフォルダ(及び その配下)になるので、狂っちゃうのですね。

そう、 たった ひとつ、 上位のフォルダの日付だけあっていない事になります。

さて、フォルダやファイルの日付を操作するユーティリティでも持っていれば、
その作成日付と更新日付を訂正するだけなのですが ... 。
普通は、その様なものは 持っていらっしゃらない のではないでしょうか?。

Windows の FileSystem の仕組みを応用し、
最初のコピーから 3 分(だったかな?)後に、 元のフォルダを移動、直後に再度元にコピー すれば、
同じ日付を再現させる事も可能だった気もしますが、 これは 荒業 です。
無駄なコピーをする事になるだけですし ... 。
                    ファイルの数が少ない時には重宝しますが。


さて、どうするか?。

Robocopy のオプションには /TIMFIX と言う 日付のみの同期の仕組みがあります。
存在していてコピーしないものも、タイムスタンプを同期してくれます。

これを流用しましょう。

つまり、
基底の階層を 日付がズレてしまった 上位の階層にして、
存在しないファイルを対象に Robocopy を実施する事になります。

上の例では、
例えば、 D:\Folder1\Folder2 配下に *.jpg が絶対に存在しないとすれば、
Robocopy D:\Folder1\Folder2 E:\Folder11\Folder2 /S /DCOPY:T /TIMFIX
を実行すれば良い訳です。
 /S /DCOPY:T オプションは不要なのですが、 元のコマンドラインを呼び出して訂正する観点から、そのままにしています。


対象範囲に存在するか否か不確定な場合には、
最後に /L オプションを付けて実行し、
ファイルがヒットしない事を確認してから 本番に臨んで下さい。

  注: コマンドラインをコピペすると  ¥ 表示は正常ですが、処理が狂う場合があります。  ¥ 部分を打ち換えて下さい。.



0 件のコメント:

コメントを投稿