このdiffコマンドチュートリアルシリーズの最初のパートでは、コマンドの動作や生成される出力の理解方法など、コマンドの基本について説明しました。このコマンドラインユーティリティには確かに少し学習曲線がありますが、特に日常業務にCLI専用のLinuxマシンでのファイル関連のタスクの実行が含まれる場合は、学習する価値があります。
diffコマンドの基本的な使用法をすでに知っていると仮定して、このチュートリアルでは、いくつかのわかりやすい例を通して、ツールが提供するさまざまなコマンドラインオプションについて説明します。
ただし、先に進む前に、このチュートリアルのすべての例は、Bashバージョン4.3.11(1)とdiffバージョン3.3を使用してUbuntu14.04でテストされていることに注意してください。
1。ファイルが同一である場合に報告する
デフォルトでは、diffコマンドが比較対象のファイルが同一であることを検出すると、出力は生成されません。
$ diff file1 file2
$
ただし、コマンドラインオプション(-s)があり、これを使用して、コマンドにこれを出力で報告させることができます。
$ diff -s file1 file2
Files file1 and file2 are identical
2。コピーされたコンテキストと統合されたコンテキスト
これらは基本的に、diffコマンドが出力を生成できる2つの異なる形式です。コピーされたコンテキストは-cコマンドラインオプションを使用して有効になり、統合コンテキストは-uを使用して有効になります。前者の例を次に示します。
$ diff -c file1 file2
*** file1 2016-12-29 09:36:47.175597647 +0530
--- file2 2016-12-29 09:19:55.799558326 +0530
***************
*** 1,3 ****
Hi
! Helllo
Bye
--- 1,3 ----
Hi
! Hello
Bye
したがって、コピーされたコンテキスト出力形式では、異なる行は感嘆符(!)で示されます。
統合コンテキスト形式の例は次のとおりです。
$ diff -u file1 file2
--- file1 2016-12-29 09:36:47.175597647 +0530
+++ file2 2016-12-29 09:19:55.799558326 +0530
@@ -1,3 +1,3 @@
Hi
-Helllo
+Hello
Bye
この出力形式では、+
および-
行の前の記号は、異なる行のバージョンを示します:ファイル1
の行の場合は「-」 ファイル2
にありません 、'+'ファイル2
の行の場合 ファイル1.
3。 'ed'スクリプトを出力する
diffコマンドは、「ed」エディターが元のファイル(この例ではfile1)を新しいファイル(file2)に変換するために使用できるコマンドを生成することもできます。これを行う方法は次のとおりです:
file1とfile2に次の変更が含まれているとします。
$ diff file1 file2
2c2
< Helllo
---
> Hello
ここで、-eコマンドラインオプションを使用して、「ed」エディターが理解できる出力を生成し、その出力をファイルにリダイレクトします。
diff -e file1 file2 > out
アウトは次のとおりです この場合に含まれるもの:
2c
Hello
.
次に行う必要があるのは、 outの最後にコマンド「w」を追加することです。 ファイル。
2c
Hello
.
w
次に、次のコマンドを実行します。
ed - file1 < out
そして、file1とfile2が同一になっていることがわかります。
$ diff file1 file2
$
この機能の詳細については、こちらをご覧ください。
4。 2列で出力を生成する
通常、diffコマンドは次の方法で出力を生成します。
$ diff file1 file2
2c2
< Helllo
---
> Hello
ただし、2つの別々の列に出力を生成するようにdiffに指示するコマンドラインオプション(-y)があります。次に例を示します:
$ diff -y file1 file2
Hi Hi
Helllo | Hello
Bye Bye
ご覧のとおり、この出力形式は「|」を使用します異なる行を示すため。
5。一般的な行を非表示にする
前のセクション(上記のポイント4)に示されている出力を観察すると、 -yを使用していることがわかります。 コマンドラインオプションのdiff(出力内)も共通の行を生成します。これらの同一の行を抑制する必要がある場合は、-suppress-common-linesを使用できます。 オプション。
[email protected]:~$ diff -y --suppress-common-lines file1 file2
Helllo | Hello
6。変更ごとにC関数を表示する
diffを使用して2つのC言語ファイルを比較する場合は、コマンドラインオプション(-p)を使用して、各変更が含まれるC関数を正確に表示するようにユーティリティに指示します。たとえば、これらが2つのCファイルであるとします。
file1.c:
#include<stdio.h>
void compare(float x, float y)
{
if(x == y) // incorrect way
{
printf("\n EQUAL \n");
}
}
int main(void)
{
compare(1.234, 1.56789);
return 0;
}
file2.c:
#include<stdio.h>
void compare(float x, float y)
{
if(x == y)
{
printf("\n EQUAL \n");
}
}
int main(void)
{
compare(1.234, 1.56789);
return 0;
}
両方のファイルを正常に比較した場合の出力は次のとおりです。
$ diff file1.c file2.c
5c5
< if(x == y) // incorrect way
---
> if(x == y)
-pを使用してファイルを比較した場合の出力は次のとおりです。 オプション:
$ diff -p file1.c file2.c
*** file1.c 2016-12-29 11:45:36.587010816 +0530
--- file2.c 2016-12-29 11:46:39.823013274 +0530
***************
*** 2,8 ****
void compare(float x, float y)
{
! if(x == y) // incorrect way
{
printf("\n EQUAL \n");
}
--- 2,8 ----
void compare(float x, float y)
{
! if(x == y)
{
printf("\n EQUAL \n");
}
ご覧のとおり、 -p 、diffを使用すると、変更がどこにあるかをより詳細に確認でき、感嘆符(!)を使用して異なる行を示します。
7。サブディレクトリを再帰的に比較する
diffコマンドを使用すると、サブディレクトリを再帰的に比較することもできますが、これはデフォルトの動作ではありません。私が言いたいのは、次の場合を考えれば:
$ diff diff-files/ second-diff-files/>
diff diff-files/file1 second-diff-files/file1
1c1
< Hi
---
> i
diff diff-files/file2 second-diff-files/file2
2c2
< Hello
---
> ello
diffコマンドは、最上位ディレクトリ内のファイルのみを比較しましたが、コマンドラインオプション-r(再帰的なdiff用)を使用すると、サブディレクトリに存在するファイルも比較されることがわかります。
$ diff -r diff-files/ second-diff-files/
diff -r diff-files/file1 second-diff-files/file1
1c1
< Hi
---
> i
diff -r diff-files/file2 second-diff-files/file2
2c2
< Hello
---
> ello
diff -r diff-files/more-diff-files/file1 second-diff-files/more-diff-files/file1
1c1
< Hi
---
> i
diff -r diff-files/more-diff-files/file2 second-diff-files/more-diff-files/file2
2c2
< Hello
---
> ello
8。存在しないファイルを空として扱います
diffコマンドには、存在しないファイルを空として扱うようにツールに指示できるオプションもあります。たとえば、file1とfile3(存在しない)を比較すると、diffのデフォルトの動作はエラーを生成します:
$ diff file1 file3
diff: file3: No such file or directory
これ自体は間違いではありません。実際、これは完全に理にかなっています。ただし、そのような状況でdiffコマンドがエラーをスローしたくない場合(bashスクリプトの一部である場合はそうかもしれません)、そのようなシナリオでは、-Nコマンドラインオプションを使用できます。これにより、コマンドは存在しないファイルを空として扱い、比較を続行します。
$ diff -N file1 file3
1,5d0
< Hi
<
< Helllo
<
< Bye
このチュートリアルシリーズの両方の部分を適切に読み、記事に含まれるすべての例を実践すれば、ツールを上手に使いこなせるようになると言っても過言ではありません。もちろん、このシリーズではdiffに関連するすべてについて説明することはできませんでしたが、重要な機能の多くがカバーされているので安心してください。
ユーティリティについて詳しく知りたい場合は、manページが常に用意されています。また、さまざまなユースケースをシミュレートするために、さまざまなファイルセットでツールを頻繁に使用し続ける必要があることは言うまでもありません。