本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、ファイルを1バイトずつ比較する「cmp」コマンドです。
本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回はファイルを1バイトずつ比較する「cmp」コマンドです。
ファイルを1バイト単位で比較するコマンドです。「diff」コマンド(第102回)では、テキストファイルを1行ずつ最後まで比較します。cmpの場合は1バイト単位で比較し、異なる箇所を見つけたら停止し、位置を表示して終了します。
短いオプション | 長いオプション | 意味 |
---|---|---|
-n バイト数 | --bytes=バイト数 | 指定したバイト数のみ比較する |
-i 位置 | --ignore-initial=位置 | 指定した位置までスキップして比較を開始する |
-i 位置1:位置2 | --ignore-initial=位置1:位置2 | 1つ目のファイルの位置1まで、2つ目のファイルの位置2までスキップする |
-b | --print-bytes | 違いのある箇所の内容を表示する(制御文字は「^」記号で示す) |
-l | --verbose | 違いのある全ての箇所について、位置(10進数)と値(8進数)を表示する |
-s | --quiet/--silent | 何も表示せず、ファイルが異なっているかどうか、ステータス(終了コード)だけを返す(0:違いがない 1:違いがある 2:エラーが発生した) |
「cmp ファイル1 ファイル2」でファイルを比較します。「diff」コマンドや「comm」コマンド(第99回)では、テキストファイルを1行単位で比較するのに対し、cmpコマンドはファイルを1バイト単位で比較します。
cmpコマンドは、ファイルを先頭から1バイトずつ比較していき、違う箇所を見つけたら、その位置を表示して終了します。ファイルの末尾まで比較するとは限りません。「-b」オプションを指定すると、異なった箇所の内容も表示します。
cmpコマンドは主にバイナリファイルの比較に使用しますが、テキストファイルの比較にも使用できます。
コマンド実行例では2つのファイル、data1.txtとdata2.txtを比較しています(画面1、画面2)。どちらもテキストファイルで、4カ所の内容が違います。5文字目が「-」と「=」、8文字目がタブと空白、12文字目も5文字目と同じ違い、2行目の先頭に「@」が入っているかいないかです。各ファイルの内容を表示する際に「od」コマンドを使いました。odコマンドはファイルを8進数でダンプ表示するコマンドです。「-t a」オプションを付けてASCII文字を表示しています(第93回)。
「cmp -b data1.txt data2.txt」で最初に見つかった異なる箇所の位置(5バイト目)と、内容(「-」と「=」)が表示されます(画面3)。
cmp ファイル1 ファイル2
(ファイルを比較する)
cmp -b ファイル1 ファイル2(画面3)
(ファイルを比較し、最初に見つかった異なった箇所の内容を表示する)
比較を開始する位置は「-i」オプションで、何バイト分比較するかは「-b」オプションで指定します。
例えば、「-i 5」で先頭5バイト分をスキップして比較すると画面4のようになります。
data1.txtとdata2.txtを比較して、最初に異なる位置は5バイト目です。そこで「-i 5」と指定して5バイト分スキップすると、8バイト目(指定した開始位置から3バイト目)にある空白とタブ(^I)が異なると表示されました。
cmp -i バイト数 ファイル1 ファイル2
(先頭から指定したバイト数スキップして比較する)(画面4)
cmp -n バイト数 ファイル1 ファイル2
(指定したバイト数だけ比較する)(画面5)
data1.txtの17バイト目から5文字分と、data2.txtの18バイト目から5文字分であれば両者とも「Apple」で共通になるはずです。
試してみましょう。「-i 16:17」で1つ目のファイルは16バイト分をスキップ、2つ目のファイルは17バイト分をスキップして、「-n 5」で5バイト分比較します。異なる箇所がないため、結果には何も表示されません(画面5)。
「-l」オプションで、異なる箇所を全て表示します。2行目は「Apple」と「@Apple」という内容なので、17バイト目以降は全て異なるという結果になりました(画面6)。さらに、2つのファイルは長さが異なるため、先にdata1.txtでファイルの終端に到達したと表示されています。
cmp -l ファイル1 ファイル2
(ファイルを比較し、異なる箇所を全て表示する)
cmp -lb ファイル1 ファイル2
(異なる箇所全てとその箇所の内容を表示する)(画面6
西村 めぐみ(にしむら めぐみ)
PC-9801NからのDOSユーザー(LinuxはPC-486DXから)。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。のち退社し、ライターとして活動。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.