ご存知のように、Linux の diff コマンドは 2 つのファイルを比較します。
ただし、Linux diff3 ユーティリティは 3 つのファイルを比較し、2 つのファイルの違いを 3 つ目のファイルにマージすることもできます。この記事では、いくつかの例を通して diff3 コマンドの使用法を理解します。
diff3 の基本的な構文は次のとおりです。
03
1.基本的な Diff3 出力
この例では、parent.txt、your.txt、mine.txt の 3 つのファイルを使用します。
12
ここで、これら 3 つのファイルに対して diff3 コマンドを実行すると:
20
出力には、これら 3 つのファイルすべての比較情報が含まれていることがわかります。上記の出力では:
- 最初の行「====」は、3 つのファイルがすべて異なることを示しています。
- 次に、行 '1:1,2c' は、diff3 の引数として指定された最初の (1:) ファイル (この場合はparent.txt) に対して、1 から 2 の範囲の行 (1,2 ) は、他の 2 つのファイルと比較すると異なるため、変更する必要があります (c)。これらの 2 行は、出力の次の 2 行にも表示されます。
- 同様に「2:1,2c」と「3:1,2c」も理解できます。
diff3 ユーティリティの使用とは別に、典型的な 2 つのファイルの比較に diff、colordiff、wdiff、または vimdiff を使用する方法を理解することも役立つことに注意してください。
2. 3 つのファイルのうち 2 つが類似している場合
この例では、ファイル mine.txt と parent.txt がまったく同じであると仮定します。
34
そして、diff3 はこれら 3 つのファイルに対して実行されます:
42
最初の行「====3」は、今回はファイル番号 3、つまり your.txt が他の 2 つとは異なることを示しています。これは出力にも表示されます。
3. 「c」は変更用で、「a」は追加用です
これまで、出力にアルファベット「c」を見てきました。この文字は、行/テキストに必要な「変更」を意味します。アルファベットの「a」が表示されている場合は、行を追加する必要があることを示しています。
別の例を見てみましょう:
50
次に、これら 3 つのファイルに対して diff3 を実行します:
63
上記の出力は、file3 (つまり your.txt) の変更を file1 (mine.txt) と file2 (parent.txt) に追加して、3 つのファイルすべてを類似させる必要があることを示しています。または、your.txt の 2 行目を変更して (c)、3 つのファイルすべてを類似させることもできます。
4. -x オプションを使用して重複する変更を出力
フラグ -x を使用して、オーバーラップを引き起こす変更を出力できます。ここでは、diff3 への引数として指定されたファイル名の順序が重要です。例:
75
これは、parent.txt を your.txt に変換する変更を mine.txt にマージすることを意味します
例を見てみましょう:
82
今すぐ diff3 を実行してください:
92
したがって、
parent.txt を your.txt に変更する変更をマージするには、mine.txt の 3 行目を「bye」に変更する必要があることが出力に示されています
5. -e オプションを使用してマージされていない変更を出力
オプション -e を使用すると、parent.txt から your.txt へのマージされていない変更を mine.txt に出力できます。
上記の例で使用したのと同じファイルを考えると:
109
したがって、マージされていない変更が出力に表示されていることがわかります。
6. -m オプションを使用してマージされたファイルを出力
-m オプションを使用すると、3 つのファイルすべての内容で構成されるマージ ファイルを生成できます。たとえば、次の 3 つのファイルの場合:
116
ここで、-m オプションを使用して diff3 を実行すると:
122
したがって、上記の出力は、diff3 への引数として提供された 3 つのファイルすべての内容をマージした、マージされたファイルの内容を示しています。
7. -m オプションを使用して競合を理解する
(3 つのファイルから) マージされたファイルを作成することは、必ずしも簡単なことではありません (上記の例に示すように)。
以下の入力ファイルの内容を考慮してください:
136
上記のファイルに対して diff3 を実行すると、次の出力が表示されます:
148
ここで、最初の 2 行はマージされたファイルの議論の余地のない部分ですが、実際の競合はファイル名と内容とともに <<<<<<<と>>>>>>> の間で示されています。
8. 「-」を使用して stdin から 1 つの引数を受け入れます
ファイル名のいずれかの代わりに「-」を使用して、その引数の stdin からの入力を受け入れることができます。
151
ご覧のとおり、上記のコマンドを実行すると、3 番目のファイルの内容が stdin から取得されました。 stdin からファイルの内容を入力した後、キーの組み合わせ ctrl+d を押して diff3 の出力を取得する必要があることに注意してください。
9. diff3 は diff ツールを使用してファイルを比較します
diff3 は 3 つのファイルを比較することを誇っていますが、実際には内部で diff ツールを使用して 2 つのファイル間の比較を実行します。これは、実行可能ファイルを入力引数として渡すことで確認できます:
168
したがって、上記の出力でわかるように、補助プログラム「diff」が失敗したことを示す diff3 コマンド エラーが出力されます。
10. –diff-program オプションで差分プログラムを指定
diff3 コマンドは、同じプログラムを使用してファイルを比較し、diff3 が使用できる結果を提供できるように、引数として diff プログラムを提供する柔軟性を提供します。この機能は、–diff-program オプションを使用して実現されます。
171
11. -a オプションを使用して、すべてのファイルをテキストとして扱います
上記の例 9 でわかるように、非テキスト ファイル (実行可能ファイル a.out) を渡すと、diff3 はエラーを返しました。しかし、diff3 に非テキスト ファイルも比較するように指示したい場合は、オプション -a を使用して、すべての入力ファイルをテキスト ファイルと見なすように diff3 に指示できます。例:
188
したがって、上記の出力は、diff3 が、テキスト ファイルとして扱う実行可能ファイルでさえも比較しようとしたことを示しています。
追加の差分記事
- UNIX / Linux の上位 4 つのファイル差分ツール – Diff、Colordiff、Wdiff、Vimdiff
- BZ はイージーです! bzdiff の例
- Vimdiff を使用したビジュアル ファイルの差分 – 違いはあります!
- Z コマンドの威力 – Zdiff の例