Mar 09, 2009

robocopyがシンボリックリンクに捕まってしまってうまく動いてくれない→/XJDオプションでうまくいった

robocopyでいけるかも、と書いたけど、全然駄目だった。ある程度まではうまくいくんだけど、途中からログに新しいディレクトリ 190 c:\Documents and Settings\ユーザ名\AppData\Local\Application Data\Application Data\Application Data\Application Data\Temp\Temp6_python24.zip\みたいに出て、再帰っていうか無限ループに陥ってしまう。

ていうかエクスプローラでCのルートとか見てもこんな名前のフォルダは存在しないのに!と思ったけど、「もしや」と思ってフォルダオプションで「保護されたオペレーティングシステムファイルを表示しない」のチェックを外してみたら、出現した。C:\Documents and Settings は C:\Users へのシンボリックリンクで、C:\Users\ユーザ名\AppData\Local\Application Data は C:\Users\ユーザ名\AppData\Local へのシンボリックリンク(Windows Vistaでは過去のアプリケーションとの互換性のためにシンボリックリンクを用意している、という話をそういえば過去に聞いたことがあった。隠しファイルになってるとは思ってもみなかった。)……ということで延々同じ所をスキャンしてたようだ。

検索してみたら似たようなトラブルが起こってるらしい人がいたけど、ちょっと現象が違うみたいで、あまり参考にならなかった……

なんとか回避できないものだろうかと思ってrobocopy /?でオプション一覧を眺めてたら、こんなオプションがあることに気付いた。

/XJD :: ディレクトリの接合ポイントを除外します。
/XJF :: ファイルの接合ポイントを除外します。

そういえばNTFSのシンボリックリンクは本当は「ジャンクション」って名前だってどっかで聞いたなあ、ということはXJDはExclude Junction Directoryの略だろうか? つまりシンボリックリンクを無視するオプションだったりするんだろうか?と思ったので、とりあえずこの2つを引数に加えてもう一度試してみてる。うまくいったらまたここに書くつもり。

……どうやらうまくいったみたいだ。さっきまで詰まってた所を通過して、これまでコピーされてなかったファイルのコピーが始まった。

ちなみに、使ったのはこんな感じの指定です。

robocopy /E /ZB /R:0 /LOG:z:\log.txt /XJD /XJF "c:\" "z:\c\"

あとは世代別バックアップの方法を考えないと。

追記。無事終わったぽ。現段階で170GB弱。4世代くらい取れるか?

バックアップA→バックアップB→バックアップC→バックアップAを差分更新(ミラーリング)→バックアップBを差分更新(ミラーリング) という感じで回していけば、全部丸ごとバックアップよりも負荷が少なく済みそうだけど……こういうのってどうやればいいんだろ。とりあえず現状既にCygwinのbash用シェルスクリプトにしてはいるので、ボチボチ考えよう。

追記。とりあえず形になったようだ。

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能