Linux diffコマンド一覧!ファイル差分の出力やディレクトリ同士を比較するオプションも解説!
Linuxのdiffコマンドで使えるオプションをご紹介します。Linuxのdiffコマンドでは2ファイルの差分を出力することを基本にディレクトリ同士の差分を出力することも可能です。ここからどんなことが出来るのかをお伝えしつつ、解説していきます。
目次
- 1Linuxのdiffコマンドを使おう!
- ・Linuxのdiffコマンドとは
- 2Linuxのdiffコマンドの基本
- ・基本動作
- ・ファイル差分の出力
- ・変動がある場合の使い方
- ・オプションなしでファイルの比較をする方法
- ・ディレクトリ同士で差異を確認する方法
- ・ファイルの違いのみを比較する方法
- 3Linuxのdiffコマンドの書式
- ・コマンドの実行例
- ・一方のディレクトリにしか存在しないファイルを使う
- ・変更のあるファイルの検出
- 4Linuxの便利なdiffコマンド
- ・sオプション
- ・qオプション
- ・cオプションはコンテキスト形式で表示
- ・Cオプションはコンテキスト形式で表示
- ・uオプションはユニファイド形式で表示
- ・yオプション
- ・rオプション
- 5Linuxの構文や出力形式
- ・実際の例
- ・構文の種類
- ・そのほかの用例
- 6Linuxのdiffコマンドをもっと使うための応用技術
- ・Cソース形式
- ・行グループやグループ変換の使い方
- 7Linuxのdiffコマンドの便利な使い方
- ・パッチの作り方
- 8便利なLinuxのdiffコマンドを使って効率化を図ろう!
Linuxのdiffコマンドを使おう!
Linuxにはdiffというコマンドがあります。diffを使うことでテキストファイルの差分を出力することができます。このdiffコマンドの用途を知っても実際にはどんな時に使えるのだ、と疑問を持つ方が多いでしょう。ですので、今回はdiffの有用性を実行例も踏まえてご紹介します。初心者の方にも分かりやすくお伝えしていきます。
Linuxのdiffコマンドとは
まず、diffコマンドとは2つのテキストファイルを比較し、その比較から出てきた差分を出力するコマンドです。形式としては「diff ファイル1 ファイル2」という形式で実行します。2つのファイルを比較して、差分を出力するものですがディレクトリ単位でも出力可能です。diffコマンドはLinuxの基本コマンドの1つで用途が多いです。
実行例
Linuxのdiffコマンドを実際に打ち込むと以下のような形式になる。以下の場合はtest1とtest2というCSVファイルの中にある差分を抽出しなさいと言う命令文になります。この2つのファイルに対してdiffコマンドを打ち込み、実際に差分が生じていれば、その差分をすべて出力されるという仕組みになります。
Linuxのdiffコマンドの基本
Linuxのdiffコマンドにはいくつかの使い分けができます。このdiffコマンドの使い分けについてご紹介しましょう。diffコマンドは確かに2つのテキストファイルの差分を出力するコマンドです。しかし、差分を出力する場面によってコマンドを変えなければいけないとしたら厄介なコマンドになってしまいます。diffコマンドはそうしたことにも対応できます。
基本動作
diffコマンドの基本動作としては、やはり2つのテキストファイルを比較し、差分を出力するということになります。構文としてはtest1とtest2のファイルを比較した配列となります。実際にdiffコマンドを実行すると次のような結果が表示されました。
結果には2c2と表示されているところがありますが、test1の2行目がtest2の2行目に変更されていることを指しています。
2c2の下にはtest1の2行目、さらに点線を挟んでtest2の2行目の内容が表示されています。ここから2ファイルが比較され、差分がどのように出力されたかが判別できます。これがdiffコマンドの最も基本的なことですので覚えておいてください。
ファイル差分の出力
少しだけ余談となりますが、Linuxのdiffの使い方というのを少しまとめておきましょう。diffを使うことで2つのテキストファイル、もしくはディレクトリの差分、つまり違っているところを出力することができます。テキスト内容が違うということは、片方でエラーが出ているときに修正ができるということになります。
あるいはdiffを使うことで変更されてしまった箇所の元の形を追うこともできます。diffの使い方の基本としてはこういったメリットがあります。diffを使うことででテキストファイルの差分を出力することができ、それを何に使うかは自由ですが、実際に業務等でdiffを使う際には参考にしてみてください。
変動がある場合の使い方
さて、Linuxのdiffコマンドができるのは基本動作だけではありません。もっと複雑な形式でも比較し、差分を出力することができます。例えば、比較したところ差分が複数個出力されてしまったらどうなるのでしょうか。正解は以下の図のようになります。
先ほど入力した内容から少しだけ変更をしています。今回は5,6c5,6と表記されています。これはtest1の5行目と6行目がtest2の5行目と6行目で変更されていることを指しています。その下にtest1の5行目と6行目の内容、点線を挟んでtest2の5行目と6行目の内容が表示されています。
今の例だと行が連番になっているので、まとめてdiffが表示してくれていますが離れた行の場合はどうなのでしょうか。例えば10行目と17行目で比較した結果、差異が出力された場合は以下のようになります。
オプションなしでファイルの比較をする方法
後ほどご紹介しますが、Linuxのdiffコマンドでオプションと呼ばれる機能を併用することもできます。ただし、オプションなしでもdiffを使うことは可能です。オプションなしでファイルを比較する方法と言いましたが、単純にdiffコマンドだけを入力すれば、その方法に該当することになります。
ただし、オプションを使わない方法でdiffを使うと面倒な上に機能が制限されてしまいますので、diffの使い方としてはあまりおすすめできません。この方法でのメリットとしてはdiff単体での能力を見ることができます。Linux初心者の方であれば、練習のためにオプションなしの方法でdiffを試してみてください。
ディレクトリ同士で差異を確認する方法
オプションなしでもdiffコマンドが使えるとお伝えしましたが、その中でオプションなしだと機能に制限がかかってしまうともお伝えしました。では、オプションを加えたdiffでは何ができるのでしょうか。後ほど詳しく説明しますがディレクトリ同士を比較して差分を出力することができます。テキストファイルだけでなく、オプションを加えたdiffには多くの使い方が付与されることになります。
ファイルの違いのみを比較する方法
また、Linuxのdiffコマンドではおpションを付与することでテキストファイルの違いだけ、あるいは同じ内容になっているかだけを確かめる使い方もできます。それぞれにqオプションとsオプションをdiffに加えれば簡単にできる方法です。diffの基本動作にオプションを加えることで使い方に幅が出てきます。
Linuxのdiffコマンドの書式
プログラミングを会得するためにはコードを自分で何度も書いてみることが近道です。それはLinuxでも同じです。そのためLinuxのdiffコマンドをいち早く会得するためには色々なケースのdiffの使い方を実際に見て、書いてみることが重要です。
diffの活躍の場としてディレクトリ同士の比較と差分の抽出があります。その実行例とそこから出力したいシーンを変えつつdiffの使い方を見ていきましょう。またディレクトリで差分を抽出できるようになればテキストファイルのみであった処理方法が拡大するため、業務の効率化にもつながります。
コマンドの実行例
実際にディレクトリ同士をdiffで比較した結果は以下の図の通りです。今回はオプションを使わずにディレクトリ同士で比較した方法です。なぜならオプションの使い方は後ほどご紹介するためです。ディレクトリ同士で比較した結果1c1ですのでtest1の1行目とtest2の1行目で差分が出ていることになっています。
ディレクトリ同士でdiffを使った結果、差分の箇所が複数個並んでいることが分かります。そのためディレクトリ同士で比較する場合には項目が多すぎると見るのが大変という欠点があります。裏を返せばディレクトリ同士の比較をdiffで行うと項目が複数個合っても出力してくれるということです。今回はドラえもんがのび太に変わっているだけでしたが、実際にはチェックが必要です。
一方のディレクトリにしか存在しないファイルを使う
Linuxのdiffコマンドでは一方のディレクトリにしか存在していないテキストファイルを出力する方法があります。この使い方はディレクトリ同士の差分を出す方法では出力できないテキストファイルを確認することができるため、結果としては新規追加した差分の出力方法になります。
このdiffの使い方をするためにはNオプションを使う必要があります。以下の図のようにdiff -N ディレクトリ1 ディレクトリ2という構文を使うことでdiffコマンドとして実行可能です。ディレクトリにあるtest1とtest2のテキストファイルを比較した結果の後に新規作成されたtest3のファイルに「0a1,3」というテキストがあります。
これは一方のファイルにしかないテキストデータが3つあり、新規作成のファイル(test3)の1行目から3行目に下に続く内容が追加されたことを指します。このような使い方をdiffコマンドに持たせることも可能です。
変更のあるファイルの検出
Linuxにはdiffコマンドと一緒に使うことで差分があるかどうかだけを表示させる方法があります。ディレクトリ内には多くのファイルがあることが一般的です。その中にあるすべての差分を検出させると膨大なテキスト内容を見ることになり、むしろ非効率になってしまいます。
そのためLinuxのdiffコマンドへqオプションを追加することで、上記のようなイメージに沿った出力方法にすることが可能です。この結果をもとに異なるファイルだけにdiffコマンドをかけ、効率的に差分を見つける使い方をしてみてください。
Linuxの便利なdiffコマンド
Linuxのdiffコマンドの内、とても便利な使い方をご紹介します。Linuxのdiffコマンドの基本動作は2つのテキストファイルを比較し、差分を出力するものです。これだけの使い方では利用するケースは限られてしまいます。しかし、オプションを加えることでdiffコマンドの使い方に幅を持たせることができます。また、オプションを加えること自体はとても簡単です。
diffコマンドに加えるオプションは何種類かあり、その中でも特に使いやすいオプションをご紹介します。もちろんオプションの使用方法もお伝えしますのでご安心ください。また、2つのファイルを比較するだけのdiffコマンドにどんな使い道があるのかも考えながらご覧ください。
sオプション
まずはsオプションです。オプションを入力する際の注意点ですが、オプションで表記するアルファベットは大文字と小文字で違う意味を持ってしまうので、入力する際に気をつけてください。Linuxのdiffコマンドに付加するオプションを入力するときの基本となります。
sオプションをdiffコマンドに追加するためには以下の図のような構文を作る必要があります。構文を入力することでdiffコマンドに対してsオプションの特性を付与することになりますので、通常のdiffコマンドとは違う結果を出力することになります。もし、求めていた結果が出力されていないのであれば、構文に問題がないかを確認するといいでしょう。
同一結果は表示しない
sオプションを追加することで同一の結果を表示しないようにできます。diffコマンドで出力された差分は比較する順番が異なっていたりすると、その分の差分も出力することになるため差分の数量を把握する際に誤差が生じる可能性があります。そのためsオプションを使うことで同じものは表示せず、スリムな形で結果を表示させることが可能です。
qオプション
2つのファイルを比較して、差分があるかどうかだけ出力するオプションです。この利用方法は前述しておりますが、ディレクトリ同士で差分を抽出することも可能です。qオプションを使うことで内容が同じファイルに関しては出力せず、差分があるファイルに関しては内訳は表示せずにファイルの組み合わせのみを表示させます。
そのため、qオプションを付加したdiffコマンドを入力することで、膨大なデータの中から差分を抽出するのではなく、差分があるファイルの組み合わせのみを見つけることが出来るので業務の効率化を図ることが可能です。
cオプションはコンテキスト形式で表示
cオプションを使い、diffコマンドを実行するとコンテキスト形式で結果を出力することができます。コンテキスト形式で出力することによって差分の発生を俯瞰することが可能です。cオプションは「--context」オプションを代用することも可能です。コンテキスト形式で出力するので、差分が発生している箇所から前後3行を表示することになります。
出力された行の初めには記号がつけられます。「!」であれば比較するファイルと内容が異なっている箇所であり、「+」であれば比較するファイルにしか存在していない行、「-」であれば比較するファイルには存在していない行という意味になります。
Cオプションはコンテキスト形式で表示
Cオプションでもコンテキスト形式で差分を出力することができます。小文字のcオプションと違う所は差分が発生している箇所から前後何行を出力するかを決められる点にあります。詳しくファイル内容を知るということであれば発生個所から表示する行数を増やすことができますし、逆に行数を減らすことも可能です。
diffコマンドへオプションを追加する際には「diff オプション名 ファイル名1 ファイル名2」という構文を入力しますが、Cオプションの場合は以下の図のように入力する必要があります。行数の部分に表示させたい行数を打ち込めば差異発生個所から指定行数分のデータを抽出することができます。
uオプションはユニファイド形式で表示
uオプションを使うことでdiffコマンドの出力結果をユニファイド形式にすることができます。cコマンドと同様に差分が発生している箇所から前後3行の内容も出力します。ユニファイド形式で出力した場合は行の初めに「-」か「+」が変更箇所に追加されます。
「-」がついている箇所はファイル1には存在する内容、「+」がついている箇所はファイル2には存在する内容という意味です。先ほどのcオプションのように、uオプションにもUオプションという兄弟がいます。Uオプションを使うことで表示する行数を変更できます。
yオプション
Linuxのdiffコマンドに付加できるオプションにyオプションというものがあります。このオプションを使うことでdiffコマンドで出力した結果を横並びで表示することができます。構文としては「$ diff –y 比較するファイル1 比較するファイル2」となります。
yオプションを付加したdiffコマンドの実行例は以下の図の通りです。差分が発生している箇所には「|」がついており、行数の確認を視覚的にできるメリットがあります。クロス集計のように差分を見たいということであればyオプションを使うべきでしょう。
rオプション
rオプションを使うことでディレクトリ同士での比較を行うことができます。当然、比較し差分を抽出するためにはdiffコマンドが必要ですが、構文としては通常通りに入力すれば問題ありません。また、diffコマンドを実行して差分が重複することもあり、片方のファイルにしか存在しない内容は「(ファイル名)のみに存在:(差分内容)」のように表示されます。
複数のオプションを組み合わせることも可能
Linuxでコマンドを入力する醍醐味として複数のオプションを組み合わせることが挙げられます。例えば、ディレクトリ同士で比較し、出力結果を横並びに表示する場合にはrオプションとyオプションが必要になります。この場合では「diff -ry ディレクトリ1 ディレクトリ2」と入力することで実行できます。
つまり、構文内にあるオプション名の部分に複数のアルファベットを入力することが出来るということです。残念ながらyオプションとcオプションなどの形式変更のオプションは同時に使うことができません。それ以外の組み合わせを自分で考え実行してみてください。
Linuxの構文や出力形式
ここからはLinuxを使う際に見ておくべき構文の種類についてご紹介しておきます。構文と聞くと英語の授業で習ったようなものを想像してしまいがちですが、Linuxをはじめプログラミングで言う構文というのは入力形式のことを指しています。またはdiffなどで出力される形式のことを指しています。ですので、正しくLinuxを動かすための手順のように考えてもらえれば問題ありません。
実際の例
今回は以下の2つ図のファイルを使います。実際にどんな内容が記載されているファイルを使うのかを予め知っておき、どんな形式で表示されるのかを見ていきましょう。diffコマンドで使える出力形式は主に6つあります。特定の形式のみを使うのではなく、その時に応じた見え方に設定することでミスがなくなりますし、結果として効率化を図ることができます。
構文の種類
6種類の構文としてはnormal形式、context形式、unified形式、side-by-side形式、ed形式、RCS形式をご紹介します。形式の違いによって記号が表す意味が異なるため注意してください。diffコマンドでこれらの構文を使うと出力される量や見え方が異なってきます。その点に注意を払いながら構文の違いを見ていきましょう。
normal形式
まずはnormal形式、つまりオプションの追加なしで単純に出力した場合の形式です。先ほどの2ファイルの差分を出力させた結果は以下の図の通りです。A2行目の「3a4はtest1の3行目の後にtest2では行が追加され、実質4行目に同じ内容が追加されているということを指しています。
A4行目の「8,9c9,10」は「test1の8~9行目が変更されて、test2の9~10行目の部分になっていることを指しています。AA行目の「14d14」は「test1の14行目を削除して、test2の14行目に消えたように表示している」ということです。つまり、14行目に関してはtest2では見当たらないようになっていることを指しています。
context形式
さて、normal形式で表示された内容をcontext形式で表示させると次の図のようになります。この形式は先ほどご紹介したcオプションをdiffコマンドに追加することで表示できます。「!」は変更がある箇所、「-」はtest2で消去されている箇所、「+」はtest2で追加されている箇所ということになります。
unified形式
diffコマンドにuオプションを追加して実行することで、ユニファイド形式、つまり以下のような形式で出力されます。context形式に似ていますが、「!」が無く追加されたされた箇所と削除された箇所のみを表示します。また、2ファイルを一度に比較している出力形式になっているので差分箇所が分かりやすくなっています。
side-by-side形式
この形式で出力すると2ファイルを2列で表示させることができます。2列の間には対応する行に対する結果記号が置かれることになります。「` '」は同一内容もしくはオプションによって無視、「|」は対応する行が異なる、「<」はファイル1にのみ存在する、「>」はファイル2のみに存在していることを指しています。
「(」はファイル1にのみ存在するが差分は無視される、「)」はファイル2にのみ存在するが差分は無視される、「\」はファイル1の行のみ行末に改行が無い、「/」はファイル2の行のみ行末に改行が無いことを指しています。横画面で差分を確認したいときに使いやすい表示形式です。
ed形式
1つ以上の差分がある場合で、差分出力の優先順位を末尾から近い方になっている特殊な形式です。この形式では改行されていない行を表示することができません。つまりファイル2の最終行が変更されていて、改行されていない場合はdiffコマンドでエラーが起きることになります。
この形式では3種類の特殊記号があります。「La」はファイル1のL行目以降にファイル2のテキストを追加している、「Rc」はファイル1の行範囲(たとえば3,7であれば3~7行目)をファイル2の内容で置き換える、「Rd」はファイル1の行範囲Rを削除することを指しています。
RCS形式
diffコマンドにnオプションを付加することでRCS形式で表示することができます。ユニファイド形式では「+」と「ー」を使っていましたが、RCS形式では「a」と「d」で表現しています。「a3 1」は3行目に1行を追加しており、その下に追加した内容を示しています。「d8 2」は8行目から2行を削除していることをさせています。
そのほかの用例
このほかにもLinuxには構文が存在しています。今回はLinuxのdiffコマンドに関する構文の中で主要なものだけご紹介しています。Linuxの他のコマンドを見る際には基本動作とオプションの効果を確認しておくとよいでしょう。
Linuxのdiffコマンドをもっと使うための応用技術
Linuxのdiffコマンドもっと効率的に使うための方法をご紹介します。diffコマンドとオプションを使うだけで効率化は十分に図れるのですが、ここからワンステップ上がってLinuxを使うことでより現実的な問題へ対応することができます。
Cソース形式
diffコマンドを使って2ファイルのCソースコードを保存しておくこともできます。この形式で比較されると2ファイルに存在する行をすべて出力しますが、共通の行は一度しか表示しません。異なる部分というのはCプリプロセッサの指定に応じて分離され、バージョンの指定も可能です。つまり、2ファイル分のテキストデータを出力し、差分もしっかり表示させることができます。
行グループやグループ変換の使い方
似ている行やグループに関しては変換記号を用いて、指定されたファイルの記述に変更することができます。この使い方をすることで好みの形に出力形式を変換することが出来るため、結果的には作為的なデータに差分を比較しながら編集することができます。
Linuxのdiffコマンドの便利な使い方
ここまでdiffコマンドは2ファイル、2ディレクトリを比較して差分を出力するコマンドとお伝えしてきました。その内容に変更はないのですが具体的な使い方という点でイメージが湧かない方のためにdiffコマンドの便利な使い方をお伝えします。この使い方を参考にしていただき、diffを使いこなしてもらえれば幸いです。
パッチの作り方
diffコマンドで出力された変更点をまとめたパッチを作るにはpatchコマンドを適用すれば作成することができます。このパッチを作る理由としてはオリジナルデータが大容量で再度オリジナルデータを作るのは手間である時の有効な対処法であるからです。パッチはcontext形式とunified形式の2つがあります。
パッチの使い方
コマンド入力画面に差分が出力されたテキストデータを追加し、patchコマンドで入手できたデータをテキストファイルに落とし込みますが、そのデータを追加するということになります。実際のコマンドとしては以下の図のようになります。最初にある「-p0」は対象のプログラムが置かれているディレクトリ階層がカレントディレクトリにあることを指しています。
このコマンドを実行することでtest1のファイルはtest2のデータに書き換えられることになります。この状態をもとに戻したい場合は同じパッチファイルを「-R」オプションを追加して実行すれば可能です。
便利なLinuxのdiffコマンドを使って効率化を図ろう!
Linuxのdiffコマンドは差分を出力するコマンドです。たったそれだけと感じる方も多いですが、そこから可能なことは案外多く、効率化を図るには十分なツールになってくれます。diffコマンドを習得するためには何度か実践する必要がありますが、基本的なコマンドの1つですので色々試してみてください。