mixiユーザー(id:23976709)

2016年07月28日17:39

23842 view

[DOS] 「robocopy」使用時には基本、オプションに「 /xo 」を付けることを習慣に。

[お題 - バックアップ/同期]
 
タイムスタンプを比べて、
新しくなっていたら上書き、
そうでなければスルー、
ということにしたい。



1.
ファイルのコピーならば

(例)
robocopy "\\LinkStation\share\Documents" "D:\USB\Documents" a.txt b.xls c.doc /xo /COPY:DT

(解説)
robocopy "(コピー元のパス)" "(コピー元先のパス)" (コピーしたいファイル名をいくつでも列挙。もちろん1コだけでもよい。) /xo /COPY:DT



2.
ディレクトリ配下を丸ごとコピーならば

(例)
robocopy "\\LinkStation\Documents" "D:\USB\Documents" /xo /E /COPY:DT

(解説)
robocopy "(コピー元のパス)" "(コピー元先のパス)" /xo /E COPY:DT



「1.」に対して「2.」は、ファイル名を並べておかないところが違います。
あとは、オプションに「 /E 」が付いています。これを付けておくことにより、配下のサブディレクトリ、そのまた配下のサブディレクトリ、…と、とにかく枝構造まるごと全てのファイルとサブディレクトリをコピーしてくれます。
逆に、「1.」の場合に「 /E 」を付けますと、コピー対象は、指定のファイルたちプラス、サブディトクトリ配下のすべて、ということになります。

ともあれ、肝心なのは、
オプションに「 /xo 」を付けること
です。
これにより、タイムスタンプが新しくなってなけりゃ、上書きされません。



ではもし、「 /xo 」を付けておかないとしたら、どうなるのでしょう。
はい、

タイムスタンプを比べて、
違っていたら上書き、
違ってなければスルー、

ということになります。

なんでこのような仕様にしたんだ、と義憤に駆られそうになりますが、
「違っていたら」なので、古くなっていても、上書きしてしまいます。
ほんとに、
な、ん、で、このような危なっかしい仕様にしたんでしょうか。
これでは
なんの事故でいつ最新ファイルを失う目に遭うことか
(元と先の指定を間違えたり、とかで)。
間違っても新しいファイルに古いファイルを上書きしたくはない、
てのが、たいがいの場合だと思うのですがね。

まー仕様が現状、標準ではそうなっているんで、仕方ありません。
必ず、「 /xo 」を付けとく。これを基本中の基本とし、習慣付けしとくしかないですね。



[逆のケース]

タイムスタンプが古いファイルの方を採用したい、てケースも、なくはないですね。なんかの復元の作業とかで。
その場合は、「 /xo 」でなく「 /xn 」をオプションに付けとくだーよ。



[コピーする情報の選択について]

上記の例では、「COPY:DT」というオプションも付いています。これ省くと「COPY:DAT」と同じことになります。
「D」: ファイルデータ
「A」: 「読み取り専用」や「アーカイブ属性」、暗号化状態などの属性情報
「T」: 「作成日時」や「更新日時」などの時刻情報
のうち、「A」を省きたくて、こうしています。(どんな場合・状況下でも動作するように)

(以前までは動作していたがなぜか動作できなくなった、「A」を取ればコピーできる、
てことがこのところ起きています。
切り分けができていないのですが、
Windows 10 になってから、
のような。そして、
外付けハードディスク⇒USB
で「A」付で問題なくコピーできる同じファイルが
USB⇒外付けハードディスク
では「A」付であるがゆえにコピーできない、
という現象が起きています。
デバイスの違いによるエラー ?
しかし別のフォルダでは
USB⇒外付けハードディスク
で「A」付でコピーできています。
できるトコできないトコでフォルダやファイルの属性に違いは見当たらないのですが、謎です。
ともあれ、「A」を外しておけば、いつでもどこでも動作します。)



[メール (Thunderbird) の同期]

(例)
robocopy "\\LinkStation\share\hinden\AppData\Roaming\Thunderbird" "D:\USB\AppData\Roaming\Thunderbird" /xo /E /COPY:DT /XF "parent.lock" "cookies.sqlite-shm"

(解説)
「 /XF 」なるオプションが追加で付いています。これは、以降に記述してあるファイルは省いてコピーしてくれ、という意味です。ここでは「parent.lock」「cookies.sqlite-shm」を省くよう指定しています。「 /XF 」指定は、しておかなくても通常は、動きます。が、「Thunderbird」が異常終了してた場合など、これらが妙な生き残り方をしててウマく動作しない場合があるので、はじめから付けておくことにしています。

(関連する過去日記)
メールのバックアップは、(エクスポートとかそういうことするんではなしに) フォルダごとコピーが、いちばんよろしい。
 ↓ 
[[パソコン] 必殺 !! 「正しい」メールのバックアップ方法。]
http://hinden.at.webry.info/201210/article_18.html
[[パソコン] メールの復元方法。]
http://hinden.at.webry.info/201210/article_20.html



[XCOPYを使用して同じことをしてみる]

「robocopy」は昔からあるコマンドではないです。その昔は、「XCOPY」てのを使っていました。まだまだ使っている人も多いです。「XCOPY」を使用した場合は、こういう書き方になります。

(例)
XCOPY "\\LinkStation\Documents" "D:\USB\Documents" /D /E /H /R /Y /C

(余談)
実は昨日まで、あたくしも「XCOPY」を使用していました。ところが最近になって、「アクセスは拒否されました ディレクトリを作成できません」とのエラーが起きてコピー取れなくなったファイルやフォルダが (上記「robocopy」の時の、「A」を付けとくとコピーできない、てのと同じ話だと思います)。
ここで、「XCOPY」のオプション指定を見直したり当該ファイルやフォルダの属性を調査したり、てするよりも、もはやいっそ「robocopy」に変えてみては、と思った次第。
ちなみに
「XCOPY」の「 /D 」オプションは、ちゃんと、
「コピー先に同名のファイルが存在する場合に更新日が新しいファイルのみコピーする」
という働きをします (「更新日が違ってたら」ではない !! 安全 !! w)。
なお、
「XCOPY」に比べて「robocopy」は速い気がします。それも、めざましく。



[しかしこれからは PowerShell ?]

試してみようとはしたのですが、コマンドプロンプトに比べて窓、開くの、遅ー。
まだしばらくは手を付けなくていいや、という気になりました。スゴスゴ。



[テーマ「コンピュータ」のブログ記事一覧]
http://hinden.at.webry.info/theme/c80af9e721.html
2 1

コメント

mixiユーザー

ログインしてコメントを確認・投稿する