LinuxのDiffコマンドは、2つのファイルの内容を行ごとに比較するために使用され、違いが見つかった場合は、行番号とともに違いも一覧表示されます。 Diffコマンドを使用して、2つのディレクトリの内容を比較することもできます。
Diffコマンドは、2つのファイルの違いに基づいてコマンドを実行するシェルスクリプトで重要な役割を果たします。
diffコマンド構文
$ diff
diffコマンドの出力は、次の形式になります。
- 通常(デフォルト)
- コンテキスト
- 統合
diffコマンド出力のさまざまな記号:
- a->何かが追加されたことを示します
- c->一部のテキストが変更されたことを示します
- d->一部のテキストが削除されたことを示します
デフォルトでは、diffコマンドは出力を通常の形式で表示します。つまり、2つのファイルの内容が同一の場合、出力は生成されませんが、プロンプトが表示されます。
この投稿では、実際の例を使用してdiffコマンドについて説明します。
1)diffコマンドで2つのファイルを比較します
2つのファイルaachen.txtがあると仮定しましょう およびsydney.txt これらのファイルの内容は次のとおりです。
[[email protected] ~]# cat aachen.txt Linux Rocks in the open source world, followings are the linux distributions: CentOS Red Hat Ubuntu Debian Linux Mint OpenSUSE Fedora [[email protected] ~]# cat sydney.txt Linux Rocks in the open source world, followings are the linux distributions: CentOS Red Hat Ubuntu Debian Linux Mint OpenSUSE Fedora [[email protected] ~]#
diffコマンドを使用してこれらのファイルの内容を比較してみましょう
[[email protected] ~]# diff aachen.txt sydney.txt [[email protected] ~]#
上記の出力は、両方のファイルが同一であることを確認します。 aachen.txtにいくつか変更を加えて、オープンソースを「オープンソース」に書き直してみましょう。
次に、diffコマンドを再実行します。
[[email protected] ~]# diff aachen.txt sydney.txt
出力、
出力では、 1c1 両方のファイルを同一にするために、最初のファイルの1行目を変更する必要があることを示します。
上記の変更をロールバックして、「 Arch Linux」という新しい行を追加しましょう。 」ファイルの最後にあるsydeny.txtで、diffコマンドを再度実行します。
差分コマンド「7a8」の出力 」は、最初のファイルの7行目の後に、2番目のファイルの8行目に一致する別の行を追加する必要があることを示します。
sydney.txtから「ArchLinux」と「Fedora」を削除してから、これらのファイルを比較してみましょう。
差分コマンド「7d6」の出力 」は、行番号6の2番目のファイルと同期するために、最初のファイルの7行目を削除する必要があることを示します。
2)コンテキスト形式(-c)でのDiffコマンド出力
diffコマンドで「-c」オプションを使用して、コンテキスト形式でdiffコマンド出力を生成します。例を以下に示します
[[email protected] ~]# diff -c aachen.txt sydney.txt
最初の2行は、ファイル名とその変更日時、および3つのアスタリスク記号(「 *** 」)を表します。 「)は、最初のファイルと3つのハイフン記号(「 — 」を示します 「)は2番目のファイルを示します。
単一のハイフン「-」のみが行を削除する必要があることを示し、プラス記号「+」は行をファイルに追加する必要があることを示します。変更を必要としない行の場合は、接頭辞として2つのスペースが付きます。
3)統一形式(-u)でのDiffコマンド出力
統一された形式で出力を生成する場合は、diffコマンドで「-u」オプションを使用します。例を以下に示します。
[[email protected] ~]# diff -u aachen.txt sydney.txt
上記の出力はコンテキスト形式に多少似ていますが、統一形式では出力が簡潔に表示されます。ここで、最初の2行は、ファイル名とその変更日時を示しています。
3つのハイフン(「—」)は最初のファイルを表し、3つのプラス記号(「+++」)は2番目のファイルを表し、2つの@記号「-1,7」は最初のファイルの行を示し、「+1,7」は2番目のファイルを表します行の範囲は2番目のファイルからです。さらに、記号(+ Core OS)は、この行を最初のファイルに追加する必要があることを示し、記号ハイフン(-Fedora)は、この行を最初のファイルから削除して2番目のファイルと同一にする必要があることを示します。
4)ファイルの比較では大文字と小文字を区別しない(-i)
デフォルトでは、diffコマンドでは大文字と小文字が区別されます。diffコマンドで大文字と小文字を区別しない場合は、「-i」オプションを使用してください。例を以下に示します。
次の2つのファイルのコンテンツがあると仮定します
オプションなしでdiffコマンドを実行します
[[email protected] ~]# diff aachen.txt sydney.txt 5,6c5,6 < Ubuntu debian < Linux mint --- > Ubuntu Debian > Linux Mint [[email protected] ~]#
次に、-iオプションを指定してdiffコマンドを実行します。
[[email protected] ~]# diff -i aachen.txt sydney.txt [[email protected] ~]#
上記の出力でわかるように、-iオプションを使用すると、diffコマンドで大文字と小文字が区別される機能が無視されます。
5)レポートファイルはdiffコマンド(-s)と同じです
diffコマンドを使用してファイルを比較している場合があり、コンテンツが同一である場合は、ファイルが同一であるというメッセージを表示する必要があります。これは、diffコマンドで「-s」オプションを渡すことで実現できます。
[[email protected] ~]# cat filex.txt DevOPs Engineer Cloud Stack Engineer Linux System Admin Monitoring Team [[email protected] ~]# cat filey.txt DevOPs Engineer Cloud Stack Engineer Linux System Admin Monitoring Team [[email protected] ~]# diff -s filex.txt filey.txt Files filex.txt and filey.txt are identical [[email protected] ~]#
6)diff(-b)を使用してファイルを比較するときに空白を無視します
2つのファイルfilea.txtがあると仮定しましょう およびfileb.txt 空白が一貫していない場合、オプションなしでdiffコマンドを使用すると、内容が同じでも空白の違いが表示されるため、このような場合は、-bオプションを使用してdiffコマンドの一貫性のない空白を無視できます。例を以下に示します
[[email protected] ~]# cat filea.txt Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks. [[email protected] ~]# cat fileb.txt Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks. [[email protected] ~]#
diffコマンドを使用してオプションなしでファイルを比較します
[[email protected] ~]# diff filea.txt fileb.txt 1c1 < Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks. --- > Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks. [[email protected] ~]#
上記のdiffコマンドで-bオプションを使用します
[[email protected] ~]# diff -b filea.txt fileb.txt [[email protected] ~]#
diffコマンドを使用して比較中にすべての空白を無視する場合は、「 -w」を使用します。 」オプション
[[email protected] ~]# diff -w filea.txt fileb.txt
7)比較中に行末の空白を無視します(-Z)
比較中に行末の試行スペースを無視する場合は、「 -Z」を使用します。 」オプション
[[email protected] ~]# diff -Z filea.txt fileb.txt
「-B」を使用します 比較中にすべての空白行を無視するには、diffコマンドの「」
[[email protected] ~]# diff -B filea.txt fileb.txt
8)2つのディレクトリを比較します
lab01とlab02という名前の2つのディレクトリがあり、これらには次のファイルとサブディレクトリがあると仮定します
[[email protected] ~]# ls -l lab01/ total 0 -rw-r--r--. 1 root root 0 Feb 1 17:49 filea.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 fileb.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 filec.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 filed.txt drwxr-xr-x. 2 root root 23 Feb 1 17:50 sitea [[email protected] ~]# ls -l lab02/ total 0 -rw-r--r--. 1 root root 0 Feb 1 17:49 filea.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 fileb.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 filec.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 filed.txt drwxr-xr-x. 2 root root 23 Feb 1 17:50 sitea [[email protected] ~]#
以下のdiffコマンドを使用してこれら2つのディレクトリを比較してみましょう
[[email protected] ~]# diff -qr lab01/ lab02/ [[email protected] ~]#
場所:
- -q ->ファイルが異なる場合にのみレポートするようにdiffコマンドに指示します
- -r ->サブディレクトリの違いを再帰的に探すようにdiffコマンドに指示します
空白の出力が表示されるので、両方のディレクトリが同一であることを意味します。 lab02からfiled.txtを削除してから、比較してみましょう。
[[email protected] ~]# cd lab02/ [[email protected] lab02]# rm -f filed.txt [[email protected] lab02]# cd [[email protected] ~]# diff -qr lab01/ lab02/ Only in lab01/: filed.txt [[email protected] ~]#
上記の出力は、filed.txtがlab01ディレクトリにのみ存在することを示しています
9)diffコマンド出力をファイルにリダイレクトする
差分コマンドの出力は、記号「>」を使用してファイルにリダイレクトできます。 diffコマンドの出力に違いが含まれている場合にのみタスクを実行したいシェルスクリプトで非常に役立ちます。
[[email protected] ~]# diff aachen.txt sydney.txt 9,10d8 < SLES < Puppy Linux [[email protected] ~]# diff aachen.txt sydney.txt > diff.txt [[email protected] ~]# cat diff.txt 9,10d8 < SLES < Puppy Linux [[email protected] ~]#
追加の例
端末上の2つのファイルを並べて比較します
diffコマンドを使用して2つのファイルを比較するときに「-y」オプションを使用すると、両方のファイルが端末に並べて表示されます。
[[email protected] ~]# diff -y /etc/fstab /tmp/fstab
出力
上記の出力は、2つのファイルの違いを明確に示しています。
これですべてです。上記の例を実行することで、diffコマンドについて理解を深めていただければ幸いです。フィードバックやコメントをお気軽に共有してください。
また読む :Linuxでの16のエコーコマンドの例
また読む :Linuxでの8つのヘッドコマンドの例