重要なポイント
- diff コマンドは、2 つのファイルを比較し、変更、削除、追加などの相違点を表示するために使用されます。
- diff コマンドの出力には、差異の種類 (変更、削除、または追加) を示す行番号とラベルが含まれます。
- diff コマンドの使用には、ファイルの相違点に関する簡単な説明の表示、並べて表示、空白文字と大文字小文字の無視、相違点のコンテキストの提供など、さまざまなオプションが用意されています。
テキスト ファイルの 2 つのリビジョン間の違いを確認する必要がありますか?次に、必要なコマンドは
diff
です。 Linux と macOS で
diff
使用する簡単な方法を紹介します。
diffコマンドとは何ですか?
diff
コマンドは 2 つのファイルを比較し、2 つのファイル間の相違点のリストを生成します。より正確に言うと、最初のファイルを 2 番目のファイルと一致させるために、最初のファイルに加える必要がある変更のリストが生成されます。このことを念頭に置くと、
diff
の出力を理解しやすくなることがわかります。
diff
コマンドは、ソース コード ファイル間の相違点を検出し、
patch
コマンドなどの他のプログラムで読み取って操作できる出力を生成するように設計されています。このチュートリアルでは、
diff
を使用する最も便利で人間に優しい方法を見ていきます。
diff コマンドの使用方法
早速 2 つのファイルを分析してみましょう。コマンドラインでのファイルの順序によって、
diff
どのファイルを「最初のファイル」と見なし、どのファイルを「2 番目のファイル」と見なすかが決まります。以下の例では、alpha1 が最初のファイルで、alpha2 が 2 番目のファイルです。どちらのファイルにも
表音文字が
含まれていますが、2 番目のファイル alpha2 にはさらに編集が加えられているため、2 つのファイルは同一ではありません。
このコマンドを使用してファイルを比較できます。
diff
、スペース、最初のファイルの名前、スペース、2 番目のファイルの名前を入力し、Enter キーを押します。
差分アルファ1アルファ2
その出力をどのように分析すればよいでしょうか?何を探すべきかさえ分かれば、それほど悪いことではありません。それぞれの相違点が 1 つの列に順番にリストされ、それぞれの相違点にラベルが付けられます。ラベルには、
4c4
のように、文字の両側に数字が含まれます。最初の数字は alpha1 の行番号、2 番目の数字は alpha2 の行番号です。真ん中の文字は次のとおりです。
- c : 最初のファイルの行は、2 番目のファイルの行と一致するように変更する必要があります。
- d : 2 番目のファイルと一致させるには、最初のファイルの行を削除する必要があります。
- a : 2 番目のファイルと一致させるには、最初のファイルに追加のコンテンツを追加する必要があります。
この例の
4c4
、alpha1 の 4 行目を alpha2 の 4 行目に一致するように変更する必要があることを示しています。これは、
diff
で見つかった 2 つのファイル間の最初の違いです。
<
で始まる行は最初のファイル (この例では alpha1) を参照し、
>
で始まる行は 2 番目のファイル alpha2 を参照します。
< Delta
行は、Delta という単語が alpha1 の 4 行目の内容であることを示しています。
> Dave
行は、Dave という単語が alpha2 の 4 行目の内容であることを示しています。要約すると、両方のファイルでその行が一致するように、alpha1 の 4 行目で Delta を Dave に置き換える必要があります。
次の変更は
12c12
によって示されます。同じロジックを適用すると、alpha1 の 12 行目には Lima という単語が含まれていますが、alpha2 の 12 行目には Linux という単語が含まれていることがわかります。
3 番目の変更は、alpha2 から削除された行を参照しています。ラベル
21d20
は、「両方のファイルを 20 行目以降で同期させるには、最初のファイルから 21 行目を削除する必要がある」と解読されます。
< Uniform
行は、alpha1 から削除する必要がある行の内容を示しています。
4 番目の違いには
26a26,28
ラベルが付けられます。この変更は、alpha2 に追加された 3 つの追加行を指します。ラベルの
26,28
に注目してください。カンマで区切られた 2 行の番号は、行番号の範囲を表します。この例では、範囲は 26 行目から 28 行目です。ラベルは「最初のファイルの 26 行目に、2 番目のファイルの 26 行目から 28 行目を追加」として解釈されます。 alpha1 に追加する必要がある alpha2 の 3 行が表示されています。これらには、「Quirk」、「Strange」、「Charm」という単語が含まれています。
diff を使用した便利な単一行コマンド
2 つのファイルが同じかどうかだけを知りたい場合は、
-s
(同一ファイルをレポート) オプションを使用します。
diff -s アルファ1 アルファ3
-q
(短い) オプションを使用すると、2 つのファイルが異なるという同様の簡潔なステートメントを取得できます。
diff -q アルファ1 アルファ2
注意すべき点の 1 つは、2 つの同一のファイルの場合、
-q
(brief) オプションが完全に機能不全に陥り、まったく何も報告しないことです。
diff の別の見方
-y
(並列) オプションは、ファイルの違いを説明するために異なるレイアウトを使用します。多くの場合、表示される列の数を制限するには、並列ビューで
-W
(幅) オプションを使用すると便利です。これにより、出力を読みにくくする醜い折り返し行を回避できます。ここでは、並べて表示を生成し、出力を 70 列に制限するように
diff
指示しました。
diff -y -W 70 アルファ 1 アルファ 2
コマンド ラインの最初のファイル alpha1 が左側に表示され、コマンド ラインの 2 番目のファイル alpha2 が右側に表示されます。各ファイルの行が並べて表示されます。 alpha2 の行の横には、変更、削除、または追加された標識文字があります。
- | : 2 番目のファイルで変更された行。
- < : 2 番目のファイルから削除された行。
- > : 最初のファイルにはない、2 番目のファイルに追加された行。
ファイルの違いを並べて簡潔にまとめたい場合は、
--suppress-common-lines
オプションを使用します。これにより、
diff
変更、追加、または削除された行のみをリストするように強制されます。
diff -y -W 70 --suppress-common-lines alpha1 alpha2
出力の差分に色のスプラッシュを追加する
colordiff
と呼ばれる別のユーティリティは、
diff
出力に色の強調表示を追加します。これにより、どの行に違いがあるのかが非常に簡単にわかります。
Ubuntu または別の Debian ベースのディストリビューションを使用している場合は、
apt-get
使用してこのパッケージをシステムにインストールします。他の Linux ディストリビューションでは、代わりに Linux ディストリビューションのパッケージ管理ツールを使用してください。
sudo apt-get インストール colordiff
diff
使用するのと同じように
colordiff
使用します。
実際、
colordiff
diff
のラッパーであり、
diff
すべての作業を舞台裏で実行します。そのため、すべての
diff
オプションは
colordiff
で機能します。
コンテキストの提供
ファイル内のすべての行を画面に表示する場合と、変更された行のみをリストする場合との間の中間点を見つけるために、
diff
にコンテキストを提供するように要求できます。これを行うには 2 つの方法があります。どちらの方法でも、変更された各行の前後にいくつかの行を表示するという同じ目的を達成できます。違いが検出された場所でファイル内で何が起こっているかを確認できます。
最初の方法では、
-c
(コピーされたコンテキスト) オプションを使用します。
colordiff -c alpha1 alpha2
diff
出力にはヘッダーがあります。ヘッダーには 2 つのファイル名とその変更時刻がリストされます。最初のファイルの名前の前にはアスタリスク (
*
) があり、2 番目のファイルの名前の前にはダッシュ (
-
) があります。アスタリスクとダッシュは、出力内の行がどのファイルに属しているかを示すために使用されます。
中央に 1,7 が付いたアスタリスクの行は、alpha1 からの行を見ていることを示します。正確に言うと、1 行目から 7 行目までを見ていきます。 Delta という単語には変更済みのフラグが立てられます。横に感嘆符 (
!
) があり、赤色です。その行の前後に変更されていないテキストが 3 行表示されているため、ファイル内のその行のコンテキストを確認できます。
中央に 1,7 がある破線は、現在 alpha2 からの線を見ていることを示しています。ここでも 1 行目から 7 行目を調べており、4 行目の Dave という単語には異なるものとしてフラグが立てられています。
各変更の上下に 3 行のコンテキストが表示されるのがデフォルト値です。
diff
で提供するコンテキストの行数を指定できます。これを行うには、
-C
(コンテキストのコピー) オプションを大文字の「C」で使用し、必要な行数を指定します。
colordiff -C 2 alpha1 alpha2
コンテキストを提供する 2 番目の
diff
オプションは、
-u
(統合コンテキスト) オプションです。
colordiff -u alpha1 alpha2
前と同様に、出力にヘッダーがあります。 2 つのファイルには名前が付けられ、それらの変更時間が表示されます。 alpha1 の名前の前にはダッシュ (
-
) があり、alpha2 の名前の前にはプラス記号 (
+
) があります。これは、ダッシュが alpha1 を参照するために使用され、プラス記号が alpha2 を参照するために使用されることを示しています。リスト全体にアットマーク (
@
) で始まる行が散在しています。これらの行は、それぞれの違いの始まりを示しています。また、各ファイルのどの行が表示されているかもわかります。
変更された行のコンテキストを確認できるように、異なるものとしてフラグが付けられた行の前後 3 行が表示されます。統合ビューでは、差異のある行が上下に表示されます。 alpha1 からの行の前にはダッシュが付き、alpha2 からの行の前にはプラス記号が付きます。この表示は、上記のコピーされたコンテキスト表示で 15 行かかった作業を 8 行で実現します。
ご想像のとおり、
diff
、必要な統一コンテキストの行数を正確に提供するように要求できます。これを行うには、
-U
(統合コンテキスト) オプションを大文字の「U」で使用し、必要な行数を指定します。
colordiff -U 2 alpha1 alpha2
空白と大文字小文字の無視
別の 2 つのファイル、test4 と test5 を分析してみましょう。これらには6人のスーパーヒーローの名前が入っています。
colordiff -y -W 70 テスト4 テスト5
結果は、
diff
ブラック ウィドウ、スパイダーマン、ソーのラインで何の違いも見つからないことを示しています。キャプテン・アメリカ、アイアンマン、ハルクのラインで変化を示しています。
それで、何が違うのでしょうか?さて、test5 では、ハルクは小文字の「h」で綴られており、キャプテン・アメリカは「Captain」と「America」の間に余分なスペースがあります。 OK、それは明らかですが、アイアンマンラインの何が問題なのでしょうか?目に見える違いはありません。ここに良い経験則があります。見えない場合、答えは空白です。その行の末尾には、ほぼ確実に 1 つまたは 2 つの空白スペース、またはタブ文字があります。
それらが重要でない場合は、次のような特定の種類の行の違いを無視するように
diff
指示できます。
- -i : 大文字と小文字の違いを無視します。
- -Z : 末尾の空白を無視します。
- -b : 空白の量の変化を無視します。
- -w : すべての空白の変更を無視します。
diff にこれら 2 つのファイルを再度チェックしてもらいましょう。ただし、今回は大文字と小文字の違いを無視します。
colordiff -i -y -W 70 テスト 4 テスト 5
「The Hulk」と「The hulk」を含む行は一致とみなされ、小文字の「h」については相違点がフラグ付けされません。
diff
末尾の空白も無視するように依頼しましょう。
colordiff -i -Z -y -W 70 テスト 4 テスト 5
推測されているように、
diff
その行の違いをフラグしなくなったため、末尾の空白が Ironman 行の違いであったに違いありません。これでキャプテン・アメリカは終わります。
diff
大文字と小文字を区別せず、すべての空白の問題を無視してもらいましょう。
colordiff -i -w -y -W 70 テスト 4 テスト 5
diff
、関心のない差異を無視するように指示することで、
diff
、目的上、ファイルが一致していることを示します。
diff
コマンドにはさらに多くのオプションがありますが、それらの大部分は機械可読出力の生成に関連しています。これらは Linux の
マニュアル ページ
で確認できます。上記の例で使用したオプションを使用すると、コマンド ラインと人間の目で、テキスト ファイルのバージョン間のすべての違いを追跡できるようになります。





