2014年11月3日月曜日

PC Robocopy でタイムスタンプを保持する

ファイルの管理でタイムスタンプは重要です。
同一ファイル名が複数のフォルダに分散して存在する場合に そのファイルを開けずに確認するには、
更新日時で追い掛けるのが最も簡単です。
それを実現する為の、 robocopy コマンドを紹介します。


さて、ファイルには、作成日時 (Created Date) や 更新日時 (Modified Date) という項目がある訳ですが。
これらは、そのファイルの履歴を追い掛ける為に付いています。
パソコンも初期の頃はそれが十分活用出来ました。
しかし、現在、これを妨げているのは、ドライブやネットワークを越えての移動 や コピー 作業です。
Windows は、これらのコピーに対して、新しい作成日時を与えます。
つまり、内容的に同一のファイルとしてコピーしても、建前上、別の新しいファイルを作った事にして、区別出来る様にしています。
ある意味では便利ですが、ある意味では不便です。

また、ファイルの中身は、データそのものと付加情報とに分かれます。
例えば、写真。
画像データが同じでも、プロパティと呼ばれる情報(例えば、レイティング・評価)を加えれば、ファイルデータ的には別物ですね。
でも、同じ写真なのに。  厳密には、画像データ自体も保存方法が変更されているケースが多いと思います。


2番目は、ファイルの構造を理解し操作しないといけないので、通常は別物として扱うのが順当なのでしょう。

しかし、最初の例で、単なるファイルコピーで日付が狂ってしまうのは避ける事が可能です。
それを実現するのが、コマンドプロンプトで robocopy というコマンドを使う事です。


元々、この robocopy は、クライアント・サーバー環境で、フォルダやファイルを管理する為に導入された経緯があります。
ファイルの所有権や各種属性を保持したままコピーしたり、フォルダを複製したり(ミラーリング)、 と言った機能があります。
つまり、クライアント(通常のパソコン)がファイルを扱うのと 異なり、
ファイルのバックアップを採ったり リカバー(復元)を提供する為に使われます。
現在では、サーバー特有の機能ではなく、一般の Windows パソコンにも標準装備されています。 Vista 以降。.


使い方は。

コマンドプロンプト ( cmd.exe ) を開き、以下のコマンドで、ヘルプが見れます。
使う前に、目を通しておきましょう。
 robocopy /?

基本は以下です。  c:¥ のピクチャに設けた photos¥abc¥123 フォルダを  m:¥ 配下の同一名にコピー 対象は全ファイル.
robocopy の後、半角スペースに続くのは、最初が元フォルダ、次がコピー先フォルダです。
コメンドでは、各項目の間に 半角スペースをひとつ 入れます。  これは、コマンドプロンプトの 決まり事 ですね。

robocopy c:¥users¥YourName¥pictures¥photos¥abc¥123 m:¥photos¥abc¥123

ここで、属性もフォルダのタイムスタンプをも合わせる場合

robocopy c:¥users¥YourName¥pictures¥photos¥abc¥123 m:¥photos¥abc¥123 /DCOPY:T /COPYALL

ふたつのフォルダの後に半角スペースを挟み、ファイル名スケルトン(例:DSC_0123.*) 指定が可能です。
この例では、 DSC_0123. のファイル名で拡張子に係わらず全てが対象になります。.

robocopy c:¥users¥YourName¥pictures¥photos¥abc¥123 m:¥photos¥abc¥123 DSC_0123.* /DCOPY:T  /COPYALL


尚、フォルダ名に半角スペースを含む場合には、" " で括る必要がありますし、
可能なら、フォルダ名に日本語は避けておくべきです。  半角英数で作っておけば問題が少ない!
特に、OS を跨ぐ環境を構築する場合には必須かもですね。 ( Linux や Mac の混在 )
  例: c:¥users¥YourName¥pictures¥abc de¥123 > "c:¥users¥YourName¥pictures¥abc de¥123"


また、大元の撮影メディアからデータ転送する場合に上記の方法を使えば、ほぼ、撮影時と同じ構成にする事も可能です。
     メディア(j ドライブ)では  j:¥DCIM¥MakerSettingFolderName *1. 配下に jpg および RAW ファイル。
     この構造を知っていれば、メディアへからのコピーも、逆にメディアへの書き出しも。



更に、指定フォルダのサブ フォルダ以下の階層に対しても再帰的に処理を行う場合 *2.
    コマンドスイッチ /S (空フォルダ除外)  または /E (空フォルダ含む) を追加 *2.
    robocopy の基本は、対象フォルダ内の ファイル *2.

robocopy c:¥users¥YourName¥pictures¥photos¥abc¥123 m:¥photos¥abc¥123 /S /DCOPY:T /COPYALL
 この例では、全ファイルが対象 ファイル名スケルトン指定なしの場合 *2.  




参考 URL と 参考コマンド   Mac もお使いの方に。

   WindowsからMacへのrobocopyでタイムスタンプがコピーできない場合の対処法 - MacRuby     MacRuby さまのサイト
   http://macruby.info/windows/windows-mac-robocopy-timestamp.html

robocopy D:¥Data¥Source¥ E:¥Data¥Target¥ /MIR /R:1 /W:0 /ETA /TEE

Mac の環境は持ち合わせませんので、何か不明な点があれば、別途、検索して下さい。.
何か不明な点がああれば、分る範囲でお答えします。.



[2014/11/04] メディアの Folder構成の間違い訂正 *1.
                           j:¥DCIM¥MakerSettingFolderName¥SubFolderName >  j:¥DCIM¥MakerSettingFolderName
[2014/11/05] 不明瞭な表現を訂正
[2015/04/15] 再帰用のスイッチの件を追記 *2.

2 件のコメント:

  1. hoto_imuです。
    robocopy 試してみました。デジカメで撮った画像をタイムスタンプを合わせてHDDに保存するためです。
    はじめ /COPYALL で引っかかってしまいましたが、管理者として実行することで解決。
    コピー先にフォルダーを作ってくれて、このフォルダーの更新日時も合ってます。
    *.JPG と *.NEF をそれぞれ挟んで2回実行すると、JPEGとRAWを別々のフォルダーに分けることができ、これは便利です。
    勢いで、 SD2HDD の名前でバッチファイルを作っちゃいました。ありがとうございます。

    返信削除
    返信
    1. hoto_imu さま コメントありがとうございます。

      便利でしょう、robocopy 。
      /COPYALL では セキュリティ(アクセス指定)や所有者や監査といった情報を保持出来る為、管理者での実行が要りましたね。
      メディアからの移動時にはあまりメリットが無いですが、その後の PC 上の移動やコピーでは 威力を発揮します。
      おお、バッチファイルをお作りですか。 これで、楽 出来ますね。

      尚、本題から外れますが、Explorer で Folder を開かないで下さい。 desktop.ini が作られます。
      また、オリジナル重視の観点から、/A+:R を Command に追加し、ReadOnly にする方法もあります。

      削除