コマンドプロンプトでdiffしたかった
失敗談です。
ひょんなことから、
「ファイルの差分比較をして、差分をログに吐く」
というバッチスクリプトを作ることに。
シェルであればdiffしてloggerすれば良いだけじゃん、なんて思いながら軽い気持ちで手を付け始めたところ、
バッチとなると知らないことが多かったのでメモ。
バッチにはdiffはなく、代わりにfc(ファイルコンパイル)というコマンドがある。
文字通り二つのファイルを比較(コンパイル)して結果を出力するというシロモノだが、これがなかなかのクセモノだった。
①出力結果に余分な情報が多い
REM 比較対象のファイルは以下
>type test1.txt
aaa
bbb
ccc
ddd
>type test2.txt
aaa
bbb
ccc
REM 出力結果
>fc test1.txt test2.txt
ファイル test1.txt と TEST2.TXT を比較しています
***** test1.txt
ddd
***** TEST2.TXT
*****
なんと、ご丁寧に処理中メッセージや差分なしファイル名まで出してくださる。
diffはウダウダ言わずに差分だけを出力してくれる。背中で語るタイプだ。僕はそういうヤツのほうが好きだ。
②文字長にリミットがある
REM 比較対象のファイルは以下
>type test1.txt
01234567891111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222223333333333
bbb
ccc
ddd
>type test2.txt
01234567891111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222224444444444
bbb
ccc
REM 出力結果
>fc test1.txt test2.txt
ファイル test1.txt と TEST2.TXT を比較しています
***** test1.txt
0123456789111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999000000000011111111112222222
2223333333333
bbb
***** TEST2.TXT
0123456789111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999000000000011111111112222222
2224444444444
bbb
*****
***** test1.txt
ddd
***** TEST2.TXT
*****
差分である1行目が127文字を区切りに改行され、さらになぜか2行目まで差分として出力されてしまった。
コマンドプロンプト的にはどういう風に認識してるんだろう?
2行目=1行目の残り文字+実際の2行目みたいなことなんだろうか。差分行の次の行が不憫すぎる。
ちなみに、140文字の行が二行あった場合は以下。
REM 比較対象のファイルは以下
>type test1.txt
01234567891111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222223333333333
bbb
01234567891111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222223333333333
ccc
ddd
eee
>type test2.txt
01234567891111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222224444444444
bbb
01234567891111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222224444444444
ccc
ddd
REM 出力結果
>fc test1.txt test2.txt
ファイル test1.txt と TEST2.TXT を比較しています
***** test1.txt
0123456789111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999000000000011111111112222222
2223333333333
bbb
***** TEST2.TXT
0123456789111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999000000000011111111112222222
2224444444444
bbb
*****
***** test1.txt
0123456789111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999000000000011111111112222222
2223333333333
ccc
***** TEST2.TXT
0123456789111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999000000000011111111112222222
2224444444444
ccc
*****
***** test1.txt
eee
***** TEST2.TXT
*****
もれなく次の行も出力している。
どうやら差分箇所をわかりやすくするために、あえて後ろの行を表示しているっぽい。
REM 比較対象のファイルは以下
>type test1.txt
水馬赤いな。ア、イ、ウ、エ、オ。
浮藻に小蝦もおよいでる。
柿の木、栗の木。カ、キ、ク、ケ、コ。
啄木鳥こつこつ、枯れけやき。
>type test2.txt
水馬赤いな。ア、イ、ウ、エ、オ。
浮藻に小蝦もおよいでる。
柿の木、栗の木。カ、キ、ク、ケ、コ。
啄木鳥こつこつ、枯れけやき。
REM 出力結果
>fc test1.txt test2.txt
ファイル test1.txt と TEST2.TXT を比較しています
***** test1.txt
水馬赤いな。ア、イ、ウ、エ、オ。
浮藻に小蝦もおよいでる。
***** TEST2.TXT
水馬赤いな。ア、イ、ウ、エ、オ。
浮藻に小蝦もおよいでる。
*****
OSの違いですなー(白目)
オチ
①についてはfindstrとかで抽出して対処できるものの、
②についてはケアする工程というか懸念が多すぎたので断念。無理でした。
WindowsとLinuxが混在する環境で、Windows側で実装しなければならない要件もなく、
目的のファイルはsamba領域に出力され、シェルでdiffされることで、ことなきを得ましたとさ。