はじめに
AzureのWindows OSのVMを使う機会があり、Git BashやWSLが使えない環境でファイルの差分を確認する必要があった。
そこで、Windowsに標準で搭載されているfcコマンド(File Compare)を使ってみた。
Linuxのdiffコマンドに相当する機能だが、WindowsではコマンドプロンプトやPowerShellから使用できる。
環境
Windows 11 Professional
コマンドプロンプトfcコマンドの基本
fcコマンドはWindowsに標準でインストールされているため、追加のインストールは不要。
fc /? 基本的な使い方は以下の通り。
fc [オプション] ファイル1 ファイル2※ファイル1が基準ファイルとなり、ファイル2と比較される。
使ってみる
準備
まずは2つのテキストファイルを用意する。
Line 1
Line 2
This is a test file
Line 4
Line 5Line 1
Line 2
This is a modified file
Line 4
Line 5テキストファイルの比較
比較を実施する
fc file1.txt file2.txt出力結果
ファイル file1.txt と FILE2.TXT を比較しています
***** file1.txt
Line 2
This is a test file
Line 4
***** FILE2.TXT
Line 2
This is a modified file
Line 4
*****差分がある行だけでなく、その前後の一致している行も含めて表示される。
オプション
| オプション | 説明 |
|---|---|
/A | 相違する各部分の1行目と最後の行だけを表示 |
/B | バイナリの比較を実行 |
/C | 英字の大文字と小文字を区別しない |
/L | ファイルをASCIIテキストとして比較 |
/LBn | 連続する最大不一致行を指定行数に設定 |
/N | ASCIIの比較で行番号を表示 |
/OFF[LINE] | オフライン属性が設定されたファイルをスキップしない |
/T | タブをスペースに変換しない |
/U | Unicodeテキストファイルとしてファイルを比較 |
/W | 連続した空白(タブとスペース)を1つのスペースに圧縮して比較 |
/nnnn | 不一致発見後に確認する、一致すべき連続行数を指定 |
オプションを含めて使ってみる
大文字小文字を区別しない (/C)
fc /C file1.txt file2.txt行番号を表示 (/N)
テキストファイル比較で行番号を表示
fc /N file1.txt file2.txt結果
ファイル file1.txt と FILE2.TXT を比較しています
***** file1.txt
2: Line 2
3: This is a test file
4: Line 4
***** FILE2.TXT
2: Line 2
3: This is a modified file
4: Line 4
*****空白とタブを無視 (/W)
空白文字とタブを無視して比較
fc /W file1.txt file2.txt使えそうなやつ
リダイレクトして結果を保存
コマンドプロンプトに直接結果が表示されるが、じっくり見たいときや差分結果を保存したい場合もあるので、その際に下記が使える。
fc file1.txt file2.txt > diff_result.txtディレクトリ内の同名ファイルを比較
一括で同名ファイルを比較するときに活用できる。
fc dir1\*.txt dir2\*.txt補足: Compare-Objectでの比較
※コマンドプロンプトでは実施できないことに注意
fcコマンドは出力形式が固定されており、diffコマンドのような+や-での表示ができない。そのため、どこに差分があるのかが分かりづらい点がある。
PowerShellのCompare-Objectを使うと、より分かりやすい出力が得られる。
Compare-Object (Get-Content file1.txt) (Get-Content file2.txt)結果
InputObject SideIndicator
----------- -------------
This is a modified file =>
This is a test file <=<=がファイル1(参照オブジェクト)のみに存在する行、=>がファイル2(差分オブジェクト)のみに存在する行を示す。
オプション
一致する行も表示 (-IncludeEqual)
Compare-Object (Get-Content file1.txt) (Get-Content file2.txt) -IncludeEqual==で両方のファイルに存在する行も表示される。
大文字小文字を区別 (-CaseSensitive)
Compare-Object (Get-Content file1.txt) (Get-Content file2.txt) -CaseSensitiveデフォルトでは大文字小文字を区別しないが、このオプションで区別するようになる。
参考
fc | Microsoft Learn
https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/fcCompare-Object | Microsoft Learn
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/compare-object?view=powershell-7.4
おわりに
Windowsのfcコマンドは標準で入っており、ファイル比較ができる便利なツールとなっている。WinMergeなどとは異なり、GUIツールを起動する手間なく、コマンドラインから素早く差分を確認できるのが利点である。
ただ、diffコマンドと異なり出力形式について、+や-での表示ができなかったり、どこに差分があるのかってことが分かりづらい点がある…。
その場合は、PowerShellのCompare-Objectコマンドレットを使うと、より分かりやすい出力が得られる。
実は初めて使う機能だったのだが、Windows環境で他に差分比較するソフト(WinMerge)やGit Bash、WSLが使えない場合に使っていこうかなと思った。