人気ブログランキング | 話題のタグを見る

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

xcopy で 絶対上書きしない方法 (2/2)

ファイルをバックアップするのに、バックアップ済みのファイルを、どんな条件でも書き換えたくない。

[理由]
バックアップ前のファイルが壊れている場合もあるからだ。
(ファイルを開いているのに気が付かないでアプリケーションごと電源OFF - 読み取り属性で開いていれば大丈夫だが画像アプリなど機能がないアプリもある)

壊れたファイルの属性が新しい日付だった場合、古いファイルへ上書きしてしまう。

最悪だ。

[試行錯誤]
新しくなければ上書きしないので、わざと作成日付や更新日付を古くする方法はあるが、そうするとコピー先にどんどん古い日付のファイルがたまって、より古い日付が必要になってくる。ファイルが大量だと古くする処理に時間もかかり、また再帰的にディレクトリを調べなくてはならない。

逆にコピー先をわざと古くする方法もあるが、日付を残しておきたい場合もあり、もどかしい。

Windows だと copy , xcopy , robocopy , RichCopy , 窓の森 ファイルマネージャ トップ3 の As/R(まめFile) , NexusFile(外国製), FenrirFS(フェンリル社)で調べたが、どうしても上書きしてしまう。

例) xcopy /D だと日付が新しいとコピー(/xl オプションで同じファイル名の時コピーする)するので、上書きを禁止できない。

[結論]
次のサイト様のNo.1の回答で、方法が分かった。

>上書き確認に対して、NULをリダイレクトしているので、YもNもAも入力されず、そこでコマンドが終わってしまいます。

簡単にやるには、N がたくさん並んだファイルを作りそれをリダイレクトで与えればいいでしょう。ファイルの個数が10000以下だとして、
(for /l %%A in (1,1,1000) do @echo NNNNNNNNNN)>%TEMP%\NNNNN
xcopy * C:\test /e /-y /q < %TEMP%\NNNNN

質問者もこれと同じようなことをやって問いかけしているので、ベストアンサーよりはこちらの方の方がより近い回答になっている。
ベストアンサーも質問者が回答者に与えなかった条件を加味していたのかもしれないので、実はベストアンサーでもよかったのかもしれない。

No.1の方の1000は、Nが10個並んでいるので1000x10=1万ファイルなので注意。そして、echoが改行コード2バイトも出力しているので、それがNULL扱いになっている。/qをはずして実行するとそれが分かる。NULLだった確認メッセージはスキップされるのではなく、再度問い合わせされて先に進んでいない。

なのでそれを超えるNを送ると、NULL扱いだった確認メッセージに対して続けてNが送信され、問題なく実行されるというわけ。

このままコピー元のディレクトリ内に例えばcp1.batなどとして作成し、コマンドプロンプトかファイルエクスプローラでそのディレクトリに移動してバッチファイルを実行(or ダブルクリック)る。

開始するとコマンドプロンプト画面が表示され、上書きに対してメッセージがだいぶ沢山出る(/-y)が、上書き以外のコピーは/qで非表示になっている。終了時には勝手に閉じる。

自分の場合はUSBメモリがE:、VHDがF:なので、
@pause
(for /l %%A in (1,1,90000) do @echo NNNNNNNNNN)>%TEMP%\NNNNN
xcopy * E:\BACKUP\hp_stream_N2380\Download /e /-y /q < %TEMP%\NNNNN

にして、cp1.batをF:\ダウンロード の下に置いてある。一応MAX90000の前に10000で実行して問題なかった。


by k1segawa | 2018-02-02 03:40 | パソコン | Comments(0)

by k1segawa