解凍不要!Ubuntuのbzcmpコマンドでbzip2ファイルを高速比較する方法

はじめに

ストレージ容量を抑えるために作成したbzip2形式のアーカイブですが、中身を確認・比較するたびに展開作業を挟むのは手間がかかり、無駄なディスクI/Oも発生します。UbuntuをはじめとするLinux環境では、bzcmpユーティリティを活用することでアーカイブを展開せずにそのままバイト単位の差分検証が可能です。本稿では、完全一致の判定から終了ステータス(終了コード)による自動判定、さらには未圧縮テキストとの横断比較まで、実務で即座に役立つ操作手順を詳しく解説します。

準備作業:bzip2パッケージ導入と検証用データの作成

まずは検証環境を整えるため、bzcmpを含むコアツール群が提供されているbzip2パッケージをシステムへ導入します。

apt-get update -qq && apt-get install -y bzip2

動作テストを行うため、同一内容のテキストファイルを2組と、意図的に末尾の内容を変えたファイルを1組用意します。

echo ‘Linux bzcmp test line 1’ > sample1.txt && echo ‘Linux bzcmp test line 1’ > sample2.txt && echo ‘Linux bzcmp test line 2’ > sample3.txt

作成したプレーンテキストを元に、元ファイルを保持するオプション(-k)を指定して.bz2ファイルを生成し、正しく配置されたか一覧表示で確認します。実行コマンドはbzip2 -k sample1.txt sample2.txt sample3.txt && ls -l sample*.bz2です。

bzip2 -k sample1.txt sample2.txt sample3.txt && ls -l sample*.bz2

同一アーカイブ同士の突合と終了ステータス($?)の検証

内容が完全に合致する2つのアーカイブを対象に、bzcmp sample1.txt.bz2 sample2.txt.bz2を実行してみます。
両者のデータに相違がない場合、標準出力には何も表示されずサイレントに処理が完了します。

bzcmp sample1.txt.bz2 sample2.txt.bz2

シェルスクリプト等で自動化する際に重要となる直前プロセスの成否を確認するため、echo "Exit Code: $?"を叩いてリターンコードを確かめます。
正常終了かつ差分なしを意味する0が返却され、2つの圧縮データが完全に一致していることが裏付けられます。

echo “Exit Code: $?”

相違があるアーカイブの検出とバイト単位オフセットの特定

今度は内容が異なるアーカイブ同士を突合させるため、bzcmp sample1.txt.bz2 sample3.txt.bz2を実行します。
データに食い違いが存在するため、最初に差異が検出されたバイト位置および行番号が端末にレポートされます。

bzcmp sample1.txt.bz2 sample3.txt.bz2

この比較処理の直後にecho "Exit Code: $?"を実行し、終了ステータスをチェックします。
コマンドの構文エラーではなく「差異が存在する」ことを示す終了コードが出力され、判定ロジックとして機能していることが分かります。

echo “Exit Code: $?”

不一致箇所の詳細を洗い出すため、-lオプションを付与してbzcmp -l sample1.txt.bz2 sample3.txt.bz2を実行します。
内部でcmp -l方式が呼び出され、相違が生じているすべてのバイトオフセット(10進数)と、それぞれのファイルが持つバイト値(8進数)が順次出力されます。

bzcmp -l sample1.txt.bz2 sample3.txt.bz2

圧縮ファイルと平文テキストの直接比較および後片付け

bzcmpの利便性は、アーカイブ同士だけでなく、圧縮された.bz2ファイルと通常の生テキストファイルを直接比較できる点にもあります。確認のためbzcmp sample1.txt.bz2 sample1.txtを実行します。
両者の実データは同一であるため、出力なしで即座に完了します。

bzcmp sample1.txt.bz2 sample1.txt

差異があるケースも試してみましょう。新たに別の文字列を含むファイルを作成し、echo 'Different text' > sample_diff.txt && bzcmp sample1.txt.bz2 sample_diff.txtを実行します。
想定通り内容の不一致が検出され、最初の相違位置(バイトおよび行番号)が速やかに通知されます。

echo ‘Different text’ > sample_diff.txt && bzcmp sample1.txt.bz2 sample_diff.txt

検証が完了したら、作成した一時テキストファイルや.bz2アーカイブを一括消去して作業環境を元に戻します。クリーンアップにはrm -f sample1.txt sample2.txt sample3.txt sample*.bz2 sample_diff.txtを用います。

rm -f sample1.txt sample2.txt sample3.txt sample*.bz2 sample_diff.txt

まとめ

本稿では、Ubuntu上でbzip2圧縮ファイルを展開することなく高速に差分チェックが行えるbzcmpコマンドの実践的な活用方法を紹介しました。
巨大なログアーカイブの突合やバックアップデータの整合性検証など、余分なストレージ領域を消費したくない現場で非常に役立つツールですので、ぜひ日々の運用業務に取り入れてみてください。