Samba共有フォルダ上のファイルをWindowsのcopy *で結合すると順序が狂ってしまう問題

Linuxのcatコマンドみたいにファイルを結合する機能ってWindowsにないの?
typeコマンドは1個のファイルを表示するだけだし、catみたいに複数のファイルを指定しても結合されないし…

と思ってWebで調べてみると、Linuxで

cat aaa bbb ccc > ddd
cat * > xxx

に相当することが Windowsでは

copy /b aaa+bbb+ccc ddd
copy /b * xxx

のような書き方で可能、これは便利!

…というようなブログ記事がよく見受けられます。

しかし!
対象ファイルがSamba共有フォルダにある場合、ワイルドカード * を使うとファイル名の順序が狂ってしまうことがあります。

例えば、Samba共有サーバとなっているLinux上のsplitコマンドでファイルを xaa xab xac … のように分割し、それを Windows上から Samba 共有上で直接 copy * で結合して復元しようとすると、意図した順序で結合されず、元通りに復元できなかったりします。

どうやらこれ、Sambaの既知の問題と関連があるらしい。対応策として

dir /on

でソートする方法があります。この方法で copy * の順不同問題を回避するには、for 文と copy + を組み合わせて1個ずつ結合していくようなバッチファイルを書くとよいでしょう。

例えば、分割されたファイルだけが自分のデスクトップ(%USERPROFILE%\desktop)の test というフォルダの中に存在している場合、次のようなバッチファイルで結合結果がデスクトップに保存されます。

copy /b nul %USERPROFILE%\desktop\結合結果.txt
for /f "usebackq" %%f in (`dir /b /on %USERPROFILE%\desktop\test\*`) do (
copy /b %USERPROFILE%\desktop\結合結果.txt+%USERPROFILE%\desktop\test\%%f %USERPROFILE%\desktop\結合結果.txt
)

copy のオプション /b は忘れずにつけましょう。なぜなら、バイナリーモードにしないとtypeコマンドの^Z問題と似たような現象に遭遇してうまく結合できなかったりするからです。
拡張子が.txtになっていますが、copy /b がついてさえいればバイナリーファイルもOKです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です