コマンドプロンプトでfcコマンドを使う

はじめに

AzureのWindows OSのVMを使う機会があり、Git BashWSLが使えない環境でファイルの差分を確認する必要があった。
そこで、Windowsに標準で搭載されているfcコマンド(File Compare)を使ってみた。
Linuxのdiffコマンドに相当する機能だが、WindowsではコマンドプロンプトやPowerShellから使用できる。

環境

Windows 11 Professional
コマンドプロンプト

fcコマンドの基本

fcコマンドはWindowsに標準でインストールされているため、追加のインストールは不要。

fc /? 

基本的な使い方は以下の通り。

fc [オプション] ファイル1 ファイル2

ファイル1が基準ファイルとなり、ファイル2と比較される。

使ってみる

準備

まずは2つのテキストファイルを用意する。

file1.txt
Line 1
Line 2
This is a test file
Line 4
Line 5
file2.txt
Line 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連続する最大不一致行を指定行数に設定
/NASCIIの比較で行番号を表示
/OFF[LINE]オフライン属性が設定されたファイルをスキップしない
/Tタブをスペースに変換しない
/UUnicodeテキストファイルとしてファイルを比較
/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コマンドのような+-での表示ができない。そのため、どこに差分があるのかが分かりづらい点がある。

PowerShellCompare-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

デフォルトでは大文字小文字を区別しないが、このオプションで区別するようになる。

参考

おわりに

Windowsのfcコマンドは標準で入っており、ファイル比較ができる便利なツールとなっている。
WinMergeなどとは異なり、GUIツールを起動する手間なく、コマンドラインから素早く差分を確認できるのが利点である。
ただ、diffコマンドと異なり出力形式について、+-での表示ができなかったり、どこに差分があるのかってことが分かりづらい点がある…。 その場合は、PowerShellCompare-Objectコマンドレットを使うと、より分かりやすい出力が得られる。

実は初めて使う機能だったのだが、Windows環境で他に差分比較するソフト(WinMerge)やGit BashWSLが使えない場合に使っていこうかなと思った。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。