
ファイル比較に関しては、GUIベースのソフトウェアが主に使用されます。 Linuxユーザーの場合は、コマンドラインで2つのファイルを比較する方法を知っておく必要があると思います。慣れれば、これは間違いなく簡単な方法です。
このチュートリアルでは、いくつかの実用的な例を通じて、diffコマンドの使用方法を学習します。
Linuxdiffコマンド
いくつかの実用的な例を通してLinuxのdiffコマンドを理解しましょう。
これらの2つのファイル(file1とfile2)があるとします:
$ cat file1
Hi,
Hello,
How are you?
I am fine,
Thank you.
$ cat file2
Hello,
Hi,
How are you?
I am fine.
両方のファイルにいくつかの小さな違いがあることがわかります。それでは、diffコマンドを使用してこれらの違いを引き出す方法を見てみましょう。
diffコマンドの実行方法は次のとおりです:
$ diff file1 file2
1d0
< Hi, 2a2 > Hi,
4,5c4
< I am fine,
< Thank you.
---
> I am fine.
したがって、diffコマンドには、コマンドライン引数として両方のファイル名が指定されており、出力に違いが生じていることがわかります。出力は決して簡単に理解できません。その理由は、人間ではなくコンピューターで使用するように設計されているためです。それでも、出力を1つずつデコードしてみましょう:
注 -ファイルfile1とfile2は、次のテキストで古いファイルと新しいファイルとして扱われます。
1d0
< Hi,
ここで、1d0行目は、0行目から両方のファイルを同期するために古いファイルの1行目を削除する必要があることを意味します(d)。古いファイルで削除される行は、すぐ下に<マークが付いています。
2a2
> Hi,
ここで、2a2行目は、古いファイルの2行目の後に新しいファイルの2行目を追加する必要があることを意味します。追加する行は、出力の次の行に>マークが付いて表示されます。
4,5c4
< I am fine,
< Thank you.
---
> I am fine.
ここで、4,5c4行目は、古いファイルの4から5までの行番号が変更されており、新しいファイルの4行目に置き換える必要があることを意味します。追加および削除される行には、それぞれ>および<のマークが付いています。
結論として、
- diffコマンドの最初の引数は古いファイルと見なされ、2番目の引数は新しいファイルになります。
- 1d0 2a2、4,5c4のような式は、構文[古いファイルからの行番号または範囲][アクション][新しいファイルからの行番号または範囲]でデコードできます。 。ここで、「アクション」は、追加、削除、または変更して置き換えることができます。
- マーク<は削除する行を表し、>は追加する行を表します。
ファイルに加えて、diffコマンドを使用して2つのディレクトリを比較することもできます。例を通してこれを学びましょう。
'new_dir'という名前のディレクトリの内容は次のとおりです:
$ ls new_dir/
file file2 frnd frnd1.cpp log1.txt log3.txt log5.txt
file1 file name with spaces frnd1 frnd.cpp log2.txt log4.txt
'old_dir'という名前のディレクトリの内容は次のとおりです:
$ ls orig_dir/
file1 file name with spaces frnd1 frnd.cpp log2.txt log4.txt test
file2 frnd frnd1.cpp log1.txt log3.txt log5.txt
さて、これがdiffコマンドが実行されたときの出力です:
$ diff new_dir/ orig_dir/
Only in new_dir/: file
Only in orig_dir/: test
したがって、これら2つのディレクトリを比較するためにdiffコマンドを実行すると、ディレクトリ内の不足しているファイルが簡単に表示されることがわかります。
一般的に使用されるコマンドラインオプションの一部を次に示します:
1)大文字と小文字の違いを無視するには-iを使用します
2つのファイルに同じテキストが含まれているが、ケースが異なる場合でも、diffコマンドはデフォルトで違いとして報告します。
例:
$ cat file1
HI
$ cat file2
hi
$ diff file1 file2
1c1
< HI --- > hi
したがって、diffコマンドが出力の大文字と小文字の違いを報告したことがわかります。
このデフォルトの動作を回避するには、-iオプションを使用します。
次に例を示します:
$ diff -i file1 file2
$
したがって、出力が生成されなかったことがわかります。これは、両方のファイルが同じ場合のデフォルトの動作です。
2)-sオプションを使用してファイルが同じであることを報告する
例1の終わりに向かって、ファイルが同じである場合、diffは何も報告しないことがわかりました。このデフォルトの動作は問題ありませんが、それでも多くの人、特に初心者を混乱させる可能性があります。したがって、diffコマンドでファイルが同じであることを明示的に報告する場合は、-sコマンドラインオプションを使用します。
次に例を示します:
$ diff -is file1 file2
Files file1 and file2 are identical
したがって、前の例で使用したコマンドに-sオプションを追加したことがわかります。今回は、diffコマンドが両方のファイルが同一であることを明示的に報告しました。
3)-bを使用してスペースを無視する
もう1つの一般的な使用例は、diffコマンドがファイルを異なるものとして報告するスペースの量が変化することです。
次に例を示します:
$ cat file1
Hi, how are you?
$ cat file2
Hi, how are you?
2つのファイルの唯一の違いは、file2の「are」と「you」という単語の間に余分なスペースがあることです。ここで、diffコマンドを使用してこれら2つのファイルを比較すると、次の出力が得られます:
$ diff file1 file2
1c1
< Hi, how are you?
---
> Hi, how are you?
したがって、diffコマンドが違いを報告したことがわかります。ただし、diffでこれらのスペースを無視する場合は、-bオプションを使用します:
$ diff -b file1 file2
$
したがって、-bオプションが原因で、diffコマンドが両方のファイルを同じものとして報告したことがわかります。
コマンドのヒント:
以下のコマンドは、2つのフォルダ間のすべてのファイルの違いを表示します
diff -Naur old/ new/
diffコマンドは、さらに多くのコマンドラインオプションを提供します。完全なリストについては、マニュアルページをお読みください。