robocopyにおけるショート・ロングファイル名の取り扱いについて
DOSの亡霊か!…と叫びたくなるような事態に遭遇したのでメモ。
コピーって一見すごく簡単な操作だと思うけど、わりと考えなくちゃいけないことが多い。…ってことが最近わかってきた。そのひとつがファイル名。ファイル名ってのは案外くせ者で、ファイルコピーの際に気にしなくちゃいけないことのひとつだったりする。
おれが遭遇したのはこんな事例。
1.WindowsからSambaの共有フォルダをマウントする。
2.Sambaの共有フォルダのsrcフォルダからWindowsのローカルフォルダdstにrobocopyでミラーリングをする。
3.コピー先のWindowsでファイルが正常にコピーされてない!
事例。
コピー元。Mac上に共有を切ってWindowsからZドライブとしてマウント。
ここからコマンドプロンプトで以下のコマンドを打つ。
C:\>robocopy /mir z:\src f:\dst
これはコピー元とコピー先を同じ状態(ミラーリング)するってコマンド。ファイル同期の常套手段らしい。
コピー先。Windows 7のローカルドライブ上のフォルダ。
ファイルがひとつコピーできてない…。なして?
…理由はWindowsにはDOS時代から引きずってるファイル名の形式によるものっぽい。いわゆる8.3形式のショートファイル名ってやつだ。
このショートファイル名はWindowsではすべてのファイルに自動的に作成されるのがデフォルト。それが悪さをしてこんな状態になってしまう。
動作としてはこんな感じ。
1.コピー元からコピー先に「テスト ファイル.txt」がコピーされる。と同時にショートファイル名「テスト~1.TXT」も作成される。
2.コピー元から「テスト~1.txt」がコピーされる。このときコピー先に既に「テスト~1.TXT」があるため「上書き」される。
3.ロングファイル名は元のまま残るが、中身は「テスト~1.txt」になる。
4.robocopyの結果は正常である。←これが重要
ログからわかんね、ってのが非常に辛い。ファイル名の精査すればわかるんだけれどさ。
以下、コマンド実行の様子。
z:\src>dir /x ドライブ Z のボリューム ラベルは ming です ボリューム シリアル番号は XXX-XXX です z:\src のディレクトリ 2011/01/17 01:06 <DIR> . 2011/01/17 01:06 <DIR> .. 2011/01/17 01:09 6 テスト ファイル.txt 2011/01/17 01:09 8 テスト~1.txt 2 個のファイル 14 バイト 2 個のディレクトリ 215,293,206,528 バイトの空き領域 z:\src>type "テスト ファイル.txt" ロング z:\src>type "テスト~1.txt" txt" ショート z:\src>f: F:\>robocopy /mir z:\src f:\dst ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: Mon Jan 17 01:12:29 2011 コピー元 : z:\src\ コピー先 : f:\dst\ ファイル: *.* オプション: *.* /S /E /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 2 z:\src\ 100% 新しいファイル 6 テスト ファイル.txt 100% 新しいファイル 8 テスト~1.txt ------------------------------------------------------------------------------ 合計 コピー済み スキップ 不一致 失敗 Extras ディレクトリ: 1 0 1 0 0 0 ファイル: 2 2 0 0 0 0 バイト: 14 14 0 0 0 0 時刻: 0:00:00 0:00:00 0:00:00 0:00:00 速度: 71 バイト/秒 速度: 0.004 MB/分 終了: Mon Jan 17 01:12:29 2011 F:\>dir /x dst ドライブ F のボリューム ラベルは ボリューム です ボリューム シリアル番号は YYY-YYY です F:\dst のディレクトリ 2011/01/17 01:12 <DIR> . 2011/01/17 01:12 <DIR> .. 2011/01/17 01:09 8 テスト~1.TXT テスト ファイル.txt 1 個のファイル 8 バイト 2 個のディレクトリ 12,127,363,072 バイトの空き領域 F:\>type "dst\テスト ファイル.txt" ショート
正直こんなのレアケースだと思うだろう?…でも世の中広いもんだ。古いDOS時代のシステムが動いていて、それがUNIXの共有フォルダにファイルを出力していて…たまたまそこにロングファイル名のファイルもあって…。いや、ハマったわ。