Linux ファイル比較

LinuxBeginner
オンラインで実践に進む

はじめに

Linux のファイル比較実験(Lab)へようこそ。現代のソフトウェア開発環境において、ファイルを比較することは、変更の追跡、問題のデバッグ、およびコードの整合性の維持に不可欠なスキルです。システム管理者や開発者として、設定ファイル、コードのバージョン、またはデータファイル間の違いを頻繁に特定する必要があります。

この実験では、diff コマンドを使用する方法を学びます。diff は、ファイルを行ごとに比較する強力な Linux ユーティリティです。diff ツールを使用すると、ファイルのバージョン間で正確に何が変更されたかを特定でき、これは設定の更新、コードの変更のレビュー、または問題のトラブルシューティングを行う際に重要です。

ファイル比較技術を習得することで、ファイルのバージョンを効率的に管理し、パッチを作成し、開発環境全体での一貫性を確保することができます。この基本的なスキルは、コード、設定ファイル、または時間とともに変化するテキストベースのデータを扱うすべての人にとって価値があります。

diff コマンドの理解

diff コマンドは、ファイルの内容を行ごとに比較するために使用される基本的な Linux ユーティリティです。このステップでは、diff コマンドの基本的な構文と、2 つの単純なテキストファイルを比較する方法を学びます。

まず、diff ユーティリティがシステムにインストールされていることを確認しましょう。/home/labex/project ディレクトリでターミナルを開き、以下のコマンドを実行します。

which diff

次のような出力が表示されるはずです。

/usr/bin/diff

これにより、diff コマンドが使用可能であることが確認されます。何らかの理由でインストールされていない場合は、以下のコマンドでインストールできます。

sudo apt-get update && sudo apt-get install -y diffutils

では、比較するための 2 つの単純なテキストファイルを作成しましょう。これらのファイルは設定を表すものとします。

echo "## Configuration File for Robot Arm" > /home/labex/project/files/config1.txt
echo "motor_speed = 100" >> /home/labex/project/files/config1.txt
echo "acceleration = 20" >> /home/labex/project/files/config1.txt
echo "max_rotation = 180" >> /home/labex/project/files/config1.txt

次に、少し違いのある 2 つ目のファイルを作成します。

echo "## Configuration File for Robot Arm" > /home/labex/project/files/config2.txt
echo "motor_speed = 120" >> /home/labex/project/files/config2.txt
echo "acceleration = 20" >> /home/labex/project/files/config2.txt
echo "max_rotation = 180" >> /home/labex/project/files/config2.txt

両方のファイルの内容を確認しましょう。

cat /home/labex/project/files/config1.txt

これにより、以下の内容が表示されます。

## Configuration File for Robot Arm
motor_speed = 100
acceleration = 20
max_rotation = 180

次に、2 つ目のファイルを表示します。

cat /home/labex/project/files/config2.txt

これにより、以下の内容が表示されます。

## Configuration File for Robot Arm
motor_speed = 120
acceleration = 20
max_rotation = 180

では、diff コマンドを使用してこれら 2 つのファイルを比較しましょう。

diff /home/labex/project/files/config1.txt /home/labex/project/files/config2.txt

次のような出力が表示されるはずです。

2c2
< motor_speed = 100
---
> motor_speed = 120

この出力は以下のことを示しています。

  • 最初のファイルの 2 行目を、2 つ目のファイルの 2 行目と一致するように変更する必要があります。
  • < は最初のファイルの行を示します。
  • > は 2 つ目のファイルの行を示します。
  • --- の行は 2 つのバージョンを区切っています。

ファイル間の違いは、motor_speed の値が 100 から 120 に変更されたことです。

高度な diff オプションの使用

前のステップでは、基本的な diff コマンドを使用して 2 つのファイルを比較しました。今度は、出力をより読みやすくし、さまざまなシナリオで役立つようにするいくつかの高度なオプションを探索しましょう。

ユニファイド形式 (-u オプション)

ユニファイド形式は、差分をより文脈を考慮した形式で表示し、ソフトウェア開発で広く使用されています。-u オプションは、差分の前後に数行の文脈を表示します。

-u オプションを使用してファイルを比較しましょう。

diff -u /home/labex/project/files/config1.txt /home/labex/project/files/config2.txt

次のような出力が表示されるはずです。

--- /home/labex/project/files/config1.txt 2023-01-01 00:00:00.000000000 +0000
+++ /home/labex/project/files/config2.txt 2023-01-01 00:00:00.000000000 +0000
@@ -1,4 +1,4 @@
 ## Configuration File for Robot Arm
-motor_speed = 100
+motor_speed = 120
 acceleration = 20
 max_rotation = 180

この形式では、以下の通りです。

  • -(マイナス)で始まる行は、最初のファイルにあるが 2 つ目のファイルにはない行です。
  • +(プラス)で始まる行は、2 つ目のファイルにあるが最初のファイルにはない行です。
  • ヘッダーには、比較されているファイルが表示されます。
  • @@ -1,4 +1,4 @@ のセクションは、表示されている行番号を示しています。

並列表示形式 (-y オプション)

並列表示形式は、両方のファイルを並列の列で表示し、差分を視覚化しやすくします。

diff -y /home/labex/project/files/config1.txt /home/labex/project/files/config2.txt

出力は次のようになるはずです。

## Configuration File for Robot Arm  ## Configuration File for Robot Arm
motor_speed = 100    | motor_speed = 120
acceleration = 20    acceleration = 20
max_rotation = 180    max_rotation = 180

この表示では、以下の通りです。

  • 中央の | 文字は、行が異なることを示しています。
  • 同一の行は、マーカーなしで両方の列に表示されます。

空白の無視 (-w オプション)

時には、空白の違いを考慮せずに内容のみを比較したい場合があります。-w オプションは、すべての空白の変更を無視します。

異なる間隔のファイルを作成しましょう。

echo "## Configuration File for Robot Arm" > /home/labex/project/files/config3.txt
echo "motor_speed = 100  " >> /home/labex/project/files/config3.txt
echo "acceleration   = 20" >> /home/labex/project/files/config3.txt
echo "max_rotation = 180" >> /home/labex/project/files/config3.txt

では、最初のファイルと比較してみましょう。まず -w オプションを使用せずに、次に -w オプションを使用して比較します。

diff /home/labex/project/files/config1.txt /home/labex/project/files/config3.txt

空白のために差分が表示されるかもしれません。次に、以下を試してみましょう。

diff -w /home/labex/project/files/config1.txt /home/labex/project/files/config3.txt

-w オプションを使用すると、唯一の違いが空白であるため、diff は差分を表示しないはずです。

これらの高度なオプションにより、diff はさまざまなユースケースやファイルタイプに対してより汎用的になります。オプションを組み合わせることで、特定のニーズに合わせて出力をカスタマイズすることができます。

パッチファイルの作成と適用

パッチファイルは、テキストファイルへの変更を配布する方法です。パッチファイルには、ファイルの 2 つのバージョン間の差分が含まれており、一方のバージョンを他方のバージョンに変換するために適用することができます。これは、コードの変更を他の人と共有したり、複数のシステム間で設定ファイルを更新する必要がある場合に特に便利です。

パッチファイルの作成

config1.txtconfig2.txt ファイル間の差分を記録したパッチファイルを作成しましょう。

diff -u /home/labex/project/files/config1.txt /home/labex/project/files/config2.txt > /home/labex/project/files/config.patch

このコマンドは、ユニファイド差分形式を使用して config.patch という名前のパッチファイルを作成します。このパッチファイルの内容を確認しましょう。

cat /home/labex/project/files/config.patch

diff -u コマンドで以前に見た出力と同様のものが表示されるはずです。

--- /home/labex/project/files/config1.txt 2023-01-01 00:00:00.000000000 +0000
+++ /home/labex/project/files/config2.txt 2023-01-01 00:00:00.000000000 +0000
@@ -1,4 +1,4 @@
 ## Configuration File for Robot Arm
-motor_speed = 100
+motor_speed = 120
 acceleration = 20
 max_rotation = 180

パッチファイルの適用

では、config1.txt のコピーを作成し、パッチを適用して更新しましょう。

cp /home/labex/project/files/config1.txt /home/labex/project/files/config1_copy.txt

パッチを適用するには、patch コマンドを使用します。

patch /home/labex/project/files/config1_copy.txt < /home/labex/project/files/config.patch

パッチが正常に適用されたことを示す出力が表示されるはずです。

patching file /home/labex/project/files/config1_copy.txt

パッチを適用したファイルが config2.txt と一致することを確認しましょう。

cat /home/labex/project/files/config1_copy.txt

出力は config2.txt と同じになるはずです。

## Configuration File for Robot Arm
motor_speed = 120
acceleration = 20
max_rotation = 180

パッチを適用したファイルと config2.txt の間に差分がないことを確認しましょう。

diff /home/labex/project/files/config1_copy.txt /home/labex/project/files/config2.txt

出力がない場合、ファイルが同一であり、パッチが正しく適用されたことが確認されます。

より複雑なパッチファイルの作成

新しいファイルの複数の行を変更して、より複雑なパッチを作成しましょう。

cp /home/labex/project/files/config1.txt /home/labex/project/files/config4.txt

次に、ファイルを編集していくつかの変更を加えます。

echo "## Updated Configuration File for Robot Arm" > /home/labex/project/files/config4.txt
echo "motor_speed = 150" >> /home/labex/project/files/config4.txt
echo "acceleration = 25" >> /home/labex/project/files/config4.txt
echo "max_rotation = 270" >> /home/labex/project/files/config4.txt
echo "safety_limit = enabled" >> /home/labex/project/files/config4.txt

これらの変更に対するパッチファイルを作成しましょう。

diff -u /home/labex/project/files/config1.txt /home/labex/project/files/config4.txt > /home/labex/project/files/complex.patch

このより複雑なパッチを見てみましょう。

cat /home/labex/project/files/complex.patch

追加、変更、場合によっては削除を含む複数の行の変更を示すパッチファイルが表示されるはずです。

パッチは、変更を配布し、ファイルの変更を追跡する効率的な方法です。コードの変更の共有、更新の作成、および設定の管理にソフトウェア開発で広く使用されています。

ディレクトリの比較と他の比較ツールの使用

個々のファイルを比較するだけでなく、Linux はディレクトリ全体を比較するツールを提供し、特定のシナリオにより適した代替の比較ツールも用意されています。

diff を使ったディレクトリの比較

diff コマンドは、-r(再帰的)オプションを使用することでディレクトリを比較することもできます。

比較するためのいくつかのファイルを持つ 2 つのディレクトリを作成しましょう。

mkdir -p /home/labex/project/dir1
mkdir -p /home/labex/project/dir2

## 最初のディレクトリにファイルを作成
echo "This is file 1" > /home/labex/project/dir1/file1.txt
echo "This is file 2" > /home/labex/project/dir1/file2.txt
echo "This is file 3" > /home/labex/project/dir1/file3.txt

## いくつかの違いを持つ類似したファイルを 2 つ目のディレクトリに作成
echo "This is file 1 - modified" > /home/labex/project/dir2/file1.txt
echo "This is file 2" > /home/labex/project/dir2/file2.txt
## 注: dir2 には file3.txt がありません
echo "This is a new file" > /home/labex/project/dir2/file4.txt

では、これらのディレクトリを比較しましょう。

diff -r /home/labex/project/dir1 /home/labex/project/dir2

次のような出力が表示されるはずです。

diff -r /home/labex/project/dir1/file1.txt /home/labex/project/dir2/file1.txt
1c1
< This is file 1
---
> This is file 1 - modified
Only in /home/labex/project/dir1: file3.txt
Only in /home/labex/project/dir2: file4.txt

この出力は以下を示しています。

  • file1.txt の内容の違い
  • file3.txtdir1 にのみ存在する
  • file4.txtdir2 にのみ存在する
  • file2.txt は両方のディレクトリで同一である(したがって差分は報告されない)

diff3 コマンドの使用

3 つのファイルを比較する必要がある場合(たとえば、複数のソースからの変更をマージするとき)、diff3 コマンドを使用することができます。

独自の変更を持つ 3 つ目の設定ファイルを作成しましょう。

echo "## Configuration File for Robot Arm" > /home/labex/project/files/config5.txt
echo "motor_speed = 100" >> /home/labex/project/files/config5.txt
echo "acceleration = 30" >> /home/labex/project/files/config5.txt
echo "max_rotation = 180" >> /home/labex/project/files/config5.txt

では、diff3 を使用して 3 つのファイルをすべて比較しましょう。

diff3 /home/labex/project/files/config1.txt /home/labex/project/files/config2.txt /home/labex/project/files/config5.txt

diff3 の出力形式は少し複雑ですが、各ファイルが他のファイルとどのように異なるかを示し、マージコンフリクトの解決に役立ちます。

colordiff コマンドの使用

colordiff ユーティリティは diff のラッパーで、同じ出力を生成しますが、色付きの構文ハイライトが付いているため、読みやすくなっています。

まず colordiff をインストールしましょう。

sudo apt-get update && sudo apt-get install -y colordiff

では、colordiff を使用してファイルを比較しましょう。

colordiff /home/labex/project/files/config1.txt /home/labex/project/files/config2.txt

出力は通常の diff コマンドと似ていますが、追加、削除、変更された行に色付きのハイライトが付いています。

wdiff コマンドの使用

wdiff(単語差分)コマンドは、行単位ではなく単語単位でファイルを比較します。これは、散文やドキュメントに対してより有用です。

wdiff をインストールしましょう。

sudo apt-get update && sudo apt-get install -y wdiff

文章の変更がある 2 つのファイルを作成しましょう。

echo "The robot arm moves quickly and efficiently." > /home/labex/project/files/sentence1.txt
echo "The robot arm moves slowly but efficiently." > /home/labex/project/files/sentence2.txt

では、wdiff でこれらを比較しましょう。

wdiff /home/labex/project/files/sentence1.txt /home/labex/project/files/sentence2.txt

変更された単語がハイライトされた出力が表示されるはずです。

The robot arm moves [-quickly and-] {+slowly but+} efficiently.

Linux のさまざまな比較ツールは、さまざまな目的とシナリオに対応しています。

  • 一般的なファイル比較には diff
  • ディレクトリ比較には diff -r
  • 三方比較には diff3
  • 色付きハイライト付きの出力には colordiff
  • 単語単位の比較には wdiff

特定のニーズに適したツールを選ぶことで、ファイル比較をより効果的かつ効率的に行うことができます。

まとめ

この実験では、Linux のファイル比較ツール、特に汎用性の高い diff コマンドの使い方を学びました。以下に習得した主要なスキルをまとめます。

  1. 基本的なファイル比較:基本的な diff コマンドを使ってテキストファイル間の差分を特定する方法を学び、設定ファイルやコードの変更を迅速に見つけることができるようになりました。

  2. 高度な diff オプション:ユニファイド形式 (-u)、並列比較 (-y)、空白の無視 (-w) などのさまざまなオプションを探索し、それぞれ異なる比較ニーズに対応できるようになりました。

  3. パッチファイル:パッチファイルの作成と適用を行いました。これは、変更の配布、システムの更新、ソフトウェアプロジェクトへの貢献に不可欠なスキルです。

  4. ディレクトリ比較:再帰オプション (-r) を使ってディレクトリ全体を比較し、複数のファイル間の差分を同時に特定することができるようになりました。

  5. 代替比較ツール:三方比較用の diff3、色付きハイライト付き出力用の colordiff、単語単位の比較用の wdiff などの特殊なツールを紹介されました。

これらのファイル比較スキルは、システム管理、ソフトウェア開発、設定管理において基本的なものです。これらのスキルを使って、変更の追跡、問題のデバッグ、バージョン管理の維持、システム間の一貫性の確保ができます。

これらのツールを習得することで、任意の Linux 環境でテキストファイルを扱う際の作業効率を向上させるための重要な能力を身につけました。