diff
は、2つのファイルを1行ずつ比較できるコマンドラインユーティリティです。ディレクトリの内容を比較することもできます。
diff
コマンドは、 patch
を使用して適用できる1つ以上のファイル間の違いを含むパッチを作成するために最も一般的に使用されます コマンド。
diff
の使用方法 コマンド#
diff
の構文 コマンドは次のとおりです:
diff [OPTION]... FILES
diff
コマンドは、出力をいくつかの形式で表示できます。最も一般的な形式は、通常形式、コンテキスト形式、および統一形式です。出力には、ファイル内のどの行を変更して同一にする必要があるかに関する情報が含まれます。ファイルが一致する場合、出力は生成されません。
コマンド出力をファイルに保存するには、リダイレクト演算子を使用します。
diff file1 file2 > patch
この記事では、次の2つのファイルを使用して、 diff
がどのように異なるかを説明します。 コマンドは機能します:
Ubuntu
Arch Linux
Debian
CentOS
Fedora
file2 Kubuntu
Ubuntu
Debian
Arch Linux
Centos
Fedora
通常のフォーマット#
diff
の場合の最も単純な形式 コマンドはオプションなしで2つのテキストファイルに対して実行され、通常の形式で出力を生成します:
diff file1 file2
出力は次のようになります:
0a1
> Kubuntu
2d2
< Arch Linux
4c4,5
< CentOS
---
> Arch Linux
> Centos
通常の出力形式は、違いを説明する1つ以上のセクションで構成されます。各セクションは次のようになります:
change-command
< from-file-line...
---
> to-file-line...
0a1
、 2d2
および4c4,5
変更コマンドです。各変更コマンドには、左から右に次のものが含まれています。
- 最初のファイルの行番号または行の範囲。
- 特別な変更文字。
- 2番目のファイルの行番号または行の範囲。
変更文字は次のいずれかになります:
-
a
-行を追加します。 -
c
-行を変更します。 -
d
-行を削除します。
変更コマンドの後には、削除された完全な行が続きます( <
)そしてファイルに追加されます(
>
。
出力について説明しましょう:
-
0a1
-行1
を追加します file1の先頭(0
の行の後)にある2番目のファイルの )。-
> Kubuntu
-上記のように最初のファイルに追加された2行目の行。
-
-
2d2
-行2
を削除します 最初のファイルで。2
d
の後 記号は、行が削除されない場合、行2
に表示されることを意味します 2番目のファイルにあります。-
-削除された行。
-
-
4c4,5
-行5
を置き換える(変更する)4-5
行の最初のファイル 2番目のファイルから。-
-置き換えられる最初のファイルの行。 -
---
-セパレーター。 -
> Arch Linux
および>Centos
-最初のファイルの行を置き換える2番目のファイルの行。
-
コンテキストフォーマット#
コンテキスト出力形式を使用する場合、 diff
コマンドは、ファイル間で異なる行の周りに数行のコンテキストを表示します。
-c
オプションはdiff
に指示します コンテキスト形式で出力を生成するには:
diff -c file1 file2
*** file1 2019-11-25 21:00:26.422426523 +0100
--- file2 2019-11-25 21:00:36.342231668 +0100
***************
*** 1,6 ****
Ubuntu
- Arch Linux
Debian
! CentOS
Fedora
--- 1,7 ----
+ Kubuntu
Ubuntu
Debian
! Arch Linux
! Centos
Fedora
出力は、比較されるファイルの名前とタイムスタンプ、および違いを説明する1つ以上のセクションで始まります。各セクションは次のようになります:
***************
*** from-file-line-numbers ****
from-file-line...
--- to-file-line-numbers ----
to-file-line...
-
from-file-line-numbers
およびto-file-line-numbers
-1番目と2番目のファイルの行番号またはコンマ区切りの行範囲。 -
from-file-line
およびto-file-line
-異なる行とコンテキストの行:- 2つのスペースで始まる行はコンテキストの行であり、両方のファイルで同じ行です。
- マイナス記号で始まる行(
-
)は、2番目のファイルの何にも対応しない行です。 2番目のファイルに行がありません。 - プラス記号(
+
で始まる行 )は、最初のファイルの何にも対応しない行です。最初のファイルに行がありません。 - 感嘆符(
!
で始まる行 )は、2つのファイル間で変更される行です。!
で始まる行の各グループ 最初のファイルから、2番目のファイルに対応する一致があります。
出力の最も重要な部分を説明しましょう:
- この例では、違いを説明するセクションが1つだけあります。
-
*** 1,6 ****
および---1,7 ----
このセクションに含まれる1番目と2番目のファイルの行の範囲を示します。 - 行
Ubuntu
、Debian
、Fedora
、および最後の空の行は、両方のファイルで同じです。これらの行はダブルスペースで始まります。 - Line
-Arch Linux
最初のファイルからは、2番目のファイルの何にも対応していません。この行は2番目のファイルにも存在しますが、位置が異なります。 - Line
+ Kubuntu
2番目のファイルからは最初のファイルの何にも対応していません。 - 行
! CentOS
最初のファイルと行から! Arch Linux
および! CentOS
2番目のファイルからファイル間で変更されます。
デフォルトでは、コンテキスト行の数はデフォルトで3になります。別の番号を指定するには、 -C
を使用します (-コンテキストコード> )オプション:
diff -C 1 file1 file2
*** file1 2019-11-25 21:00:26.422426523 +0100
--- file2 2019-11-25 21:00:36.342231668 +0100
***************
*** 1,5 ****
Ubuntu
- Arch Linux
Debian
! CentOS
Fedora
--- 1,6 ----
+ Kubuntu
Ubuntu
Debian
! Arch Linux
! Centos
Fedora
統一フォーマット#
統一された出力形式は、コンテキスト形式の改良版であり、より小さな出力を生成します。
-u
を使用します diff
に伝えるオプション 統一された形式で出力を印刷するには:
diff -u file1 file2
--- file1 2019-11-25 21:00:26.422426523 +0100
+++ file2 2019-11-25 21:00:36.342231668 +0100
@@ -1,6 +1,7 @@
+Kubuntu
Ubuntu
-Arch Linux
Debian
-CentOS
+Arch Linux
+Centos
Fedora
出力は、ファイルの名前とタイムスタンプ、および違いを説明する1つ以上のセクションで始まります。各セクションの形式は次のとおりです。
***************
@@ from-file-line-numbers to-file-line-numbers @@
line-from-files...
-
@@ from-file-line-numbers to-file-line-numbers @@
-このセクションに含まれる1番目と2番目のファイルの行番号または行の範囲。 -
line-from-files
-異なる行とコンテキストの行:- 2つのスペースで始まる行はコンテキストの行であり、両方のファイルで同じ行です。
- マイナス記号で始まる行(
-
)は削除された行です 最初のファイルから。 - プラス記号(
+
で始まる行 )は追加された行です 最初のファイルから。
上記の例でお気づきかもしれませんが、 diff
コマンドはデフォルトで大文字と小文字を区別します。
-i
を使用します diff
に伝えるオプション 大文字と小文字を区別しない:
diff -ui file1 file2
--- file1 2019-11-25 21:00:26.422426523 +0100
+++ file2 2019-11-25 21:00:36.342231668 +0100
@@ -1,6 +1,7 @@
+Kubuntu
Ubuntu
-Arch Linux
Debian
+Arch Linux
CentOS
Fedora
結論#
テキストファイルの違いを比較することは、Linuxシステム管理者にとって最も一般的なタスクの1つです。
diff
コマンドはファイルを1行ずつ比較します。詳細については、 man diff
と入力してください ターミナルで。
ご不明な点がございましたら、下にコメントを残してください。