バイナリファイルを比較して同じかどうかを確認するにはどうすればよいですか?


186

2つのバイナリファイルが同じかどうか(タイムスタンプを除く)を確認する最も簡単な方法(グラフィカルツールまたはUbuntu Linuxのコマンドラインを使用)は何ですか?実際に違いを抽出する必要はありません。それらが同じかどうかを知る必要があるだけです。


5
表示するように尋ねる質問どのように彼らは異なりますsuperuser.com/questions/125376/...
チロSantilli郝海东冠状病六四事件法轮功

2
のmanページcmpには、バイトごとの比較を行うと明記されているため、これが2つのバイナリファイルのデフォルトです。diff行ごとであり、同じはい/いいえの答えを出しますが、もちろん標準出力ストリームへの同じダンプではありません。テキストファイルではない可能性があるために行が長い場合は、私が優先しcmpます。diffには、ディレクトリの比較と-r再帰を指定できるため、1つのコマンドで複数のファイルを比較できるという利点があります。
H2ONaCl

回答:


180

標準のUNIX diffでは、ファイルが同じかどうかが表示されます。

[me@host ~]$ diff 1.bin 2.bin
Binary files 1.bin and 2.bin differ

コマンドからの出力がない場合は、ファイルに違いがないことを意味します。


5
diffは非常に大きなファイルで問題があるようです。diff: memory exhausted2つの13Gファイルを比較すると、
Yongwei Wu

1
興味深い出力。diff彼らはあなたに「バイナリ」の敵だと言っています。すべてのファイルはバイナリであると見なすことができるため、奇妙な主張です。
H2ONaCl

7
オプションを使用して同一のファイルを報告できます:diff -s 1.bin 2.binまたはdiff --report-identical-files 1.bin 2.binこれが表示されますFiles 1.bin and 2.bin are identical
Tom Kuschel

1
いいえ、それらは「異なる」と言われるため、同じではありません
ジョセフクリムク

1
私は2つの実行可能ファイルを持っていますが、コンパイルして実行したのでそれらが異なることはわかっていますが、ここで与えられたdiffとcmpのすべてのオプションはそれらを同一と判断します。どうして?!!!
ミルカスタット

107

cmpコマンドを使用します。これは、バイナリが等しい場合は正常に終了するか、最初の違いが発生した場所を出力して終了します。


9
ユースケースの場合、OPはIMHO cmpがより効率的であると説明していdiffます。だから私はこれを好みます。
Halloleo 2013

5
私は、シェルスクリプトを持っているの実行:cmp $1 $2 && echo "identical" || echo "different"
steveha

2
cmpは最初の違いを見つけたときに停止してそれを表示しますか、それともファイルの最後を通過しますか?
2016年

cmp「サイレント」モード:-s, --quiet, --silent- suppress all normal output。まだテストはしていませんが、もしあれば最初の差で止まると思います。
Victor Yarema 2016年

90

Visual Binary Diffが私が探していたものであることがわかりました。

  • Ubuntu:

    sudo apt install vbindiff
    
  • Arch Linux:

    sudo pacman -S vbindiff
    
  • MacPorts経由のMac OS X :

    port install vbindiff
    
  • Homebrew経由のMac OS X:

    brew install vbindiff
    

1
いいですね... / thought /ファイルが異なるかどうか知りたいだけでした。正確な違いを簡単に確認できることは、はるかに便利でした。ファイルの最後に到達すると、segfaultが発生する傾向がありましたが、問題なく動作しました。
ジェレミー

2
何度か言われていますが、これは素晴らしい小さなプログラムです!(fyiも自作)
johncip

2
これは、平凡で役に立たない標準的なdiffコマンドの出力よりもはるかに優れた方法であるため、受け入れられる答えになるはずです。
Gearoidマーフィー2018

1
これは、バイナリdiffに最適なツールです。
カーラカマルゴ

17

sha1を使用してチェックサムを生成します。

sha1 [FILENAME1]
sha1 [FILENAME2]

3
ファイルの1つだけのチェックサムがある場合、これは便利ですが、ディスクに両方のファイルがある場合、これは不要です。diffそして、cmp両方とも、特別な努力なしにそれらが異なるかどうかを教えてくれます。
johncip

1
sha1sum代わりではないsha1ですか?
2017

2
NetBSDではsha1、Linuxではsha1sum
Scott

2
異なっているにもかかわらず、同じ結果を返す2つのファイルがあります。shattered.io
MIK

2
SHA1にはすでに1つのパブリックコリジョン(shattered.io)があり、おそらくいくつかの非パブリックも同様です。1つの衝突を使用して、無数の衝突ファイルを生成できます。代わりにハッシュにSHA2を使用してください。
Michal Ambroz、

12

結局、hexdumpを使用してバイナリファイルを16進数表現に変換し、それらをmeld / kompare /その他のdiffツールで開きました。あなたと違って、私はファイルの違いを求めていました。

hexdump tmp/Circle_24.png > tmp/hex1.txt
hexdump /tmp/Circle_24.png > tmp/hex2.txt

meld tmp/hex1.txt tmp/hex2.txt

1
hexdump -v -e '/1 "%02x\n"'比較して、挿入または削除されたバイトを正確に確認する場合に使用します。
William Entriken

Meldは、バイナリファイルが最初に16進数に変換されていない場合にも機能します。これは、文字セットに含まれていないものの16進値を示します。それ以外の場合は通常の文字を示します。これは、ASCIIテキストを含むバイナリファイルで役立ちます。多くの場合、少なくともマジックストリングで始まります。
Felix Dombek

7

MD5ハッシュ関数を使用して2つのファイルが同じかどうかを確認できます。これにより、低レベルでの違いを確認することはできませんが、2つのファイルをすばやく比較できます。

md5 <filename1>
md5 <filename2>

両方のMD5ハッシュ(コマンド出力)が同じ場合、2つのファイルに違いはありません。


7
反対票について説明していただけますか?SHA1には4つの賛成票があり、2つのファイルが同じまたは類似している可能性があるとOPが判断した場合、衝突の可能性はわずかであり、MD5に反対票を投じる価値はありませんが、ハッシュする必要があると聞いた場合以外はSHA1に反対票を投じる価値があります。 MD5ではなくSHA1を使用したパスワード(これは別の問題です)。
Rikki

2
ないでください理由について純粋なCMPは(少なくとも、唯一の2つのファイルのために)のいずれかのファイルのハッシュ関数を計算し、それらを比較するよりも効率的になります
パヴェルSzczur

1
2つのファイルが大と同じディスク(SSDではない)である場合、ディスクが頭の動きの多くを保存し順次2つのファイルを読むことができるので、MD5またはSHA *バリアントは速いかもしれない
ダニエル・アルダー

7
以前の(悪い)ソリューションのマイナーバリアントをコメントとして投稿したため、反対票を投じました。
johncip 2017年

6

cmpコマンドを使用します。詳細については、バイナリファイルとテキスト比較の強制を参照してください。

cmp -b file1 file2

1
-b「バイナリモード」でファイルを比較しません。実際には、「GNU cmpでは、-bor --print-bytesオプションを使用して、それらのバイトのASCII表現を表示することもできます。」これは、あなたが提供したマニュアルのURLを使用して私が見つけたものとまったく同じです。
Victor Yarema 2016年

ビクター・ヤレマ、「バイナリーモード」とはどういう意味かわかりません。cmp私の意見では、本質的にバイナリ比較です。この-bオプションは、異なる最初のバイトを出力するだけです。
H2ONaCl

4

フラッシュメモリの欠陥を見つけるために、違いを含むすべての1Kブロックを表示するこのスクリプトを作成する必要がありました(最初のものだけではありcmp -bません)。

#!/bin/sh

f1=testinput.dat
f2=testoutput.dat

size=$(stat -c%s $f1)
i=0
while [ $i -lt $size ]; do
  if ! r="`cmp -n 1024 -i $i -b $f1 $f2`"; then
    printf "%8x: %s\n" $i "$r"
  fi
  i=$(expr $i + 1024)
done

出力:

   2d400: testinput.dat testoutput.dat differ: byte 3, line 1 is 200 M-^@ 240 M- 
   2dc00: testinput.dat testoutput.dat differ: byte 8, line 1 is 327 M-W 127 W
   4d000: testinput.dat testoutput.dat differ: byte 37, line 1 is 270 M-8 260 M-0
   4d400: testinput.dat testoutput.dat differ: byte 19, line 1 is  46 &  44 $

免責事項:5分でスクリプトをハッキングしました。コマンドライン引数をサポートしておらず、ファイル名のスペースもサポートしていません


「r:not found」(GNU linuxを使用)を取得
unseen_rider

@unseen_riderどのシェル、どの行?sh -xデバッグに使用するスクリプトを呼び出してください
Daniel Alder

これは、ターミナルからスクリプトを呼び出すことによるものです。ラインは9です
unseen_rider

@unseen_riderこのようにあなたを助けることはできません。スクリプトは大丈夫です。デバッグ出力をpastebin.comに投稿してください。ここで私が意味するところを見ることができます:pastebin.com/8trgyF4A。また、私の出力教えてくださいreadlink -f $(which sh)
ダニエル・アルダー

最後のコマンドはを与え/bin/dashます。現在、ペーストビンにペーストを作成しています。
unseen_rider 2017

4

次のオプションを指定したdiffは、ファイルがまったく異なるかどうかを確認するためにバイナリ比較を実行し、ファイルが同じかどうかも出力します。

diff -qs {file1} {file2}

異なるディレクトリにある同じ名前の2つのファイルを比較する場合は、代わりに次の形式を使用できます。

diff -qs {file1} --to-file={dir2}

OS X El Capitan


3

diff -sを試してください

短い答え:スイッチで実行diff-sます。

長い答え:以下をお読みください。


ここに例があります。ランダムなバイナリコンテンツを持つ2つのファイルを作成することから始めましょう。

$ dd if=/dev/random bs=1k count=1 of=test1.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0100332 s, 102 kB/s

                                                                                  
$ dd if=/dev/random bs=1k count=1 of=test2.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0102889 s, 99,5 kB/s

次に、最初のファイルのコピーを作成します。

$ cp test1.bin copyoftest1.bin

これでtest1.binとtest2.binは異なるはずです。

$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ

...とtest1.binとcopyoftest1.binは同一でなければなりません:

$ diff test1.bin copyoftest1.bin

ちょっと待って!なぜ出力がないのですか?!?

答えは、これは仕様によるものです。同一のファイルに関する出力はありません。

しかし、さまざまなエラーコードがあります。

$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

幸いなことに、-s(または--report-identical-files)スイッチを使用してdiffをより冗長にすることができるため、毎回エラーコードを確認する必要はありません。

$ diff -s test1.bin copyoftest1.bin
Files test1.bin and copyoftest1.bin are identical

2

Radiff2は、通常のdiffがテキストファイルを比較する方法と同様に、バイナリファイルを比較するために設計されたツールです。

逆アセンブラのradiff2一部であるものを試してくださいradare2。たとえば、次のコマンドを使用します。

radiff2 -x file1.bin file2.bin

違いが強調表示されている、かなりフォーマットされた2列の出力が得られます。


1

vimパッケージのxxd hex-dumperを使用する私のお気に入りのもの:

1)vimdiff(vimの一部)の使用

#!/bin/bash
FILE1="$1"
FILE2="$2"
vimdiff <( xxd "$FILE1" ) <( xxd "$FILE2" )

2)差分を使用する

#!/bin/bash
FILE1=$1
FILE2=$2
diff -W 140 -y <( xxd $FILE1 ) <( xxd $FILE2 ) | colordiff | less -R -p '  \|  '

0
md5sum binary1 binary2

md5sumが同じ場合、バイナリは同じです

例えば

md5sum new*
89c60189c3fa7ab5c96ae121ec43bd4a  new.txt
89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt
root@TinyDistro:~# cat new*
aa55 aa55 0000 8010 7738
aa55 aa55 0000 8010 7738


root@TinyDistro:~# cat new*
aa55 aa55 000 8010 7738
aa55 aa55 0000 8010 7738
root@TinyDistro:~# md5sum new*
4a7f86919d4ac00c6206e11fca462c6f  new.txt
89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt

1
結構です。可能性が高いだけです。

失敗する確率はどれくらいですか?
ashish

スリムですが、の一部のバリアントを使用するよりも悪く、diffそれを優先する理由はありません。

このアドバイスを実用的にするには、MD5ハッシュをSHA2に変更する必要があります。誰のラップトップでも、最近、MD5で衝突を生成し、この単一の衝突プレフィックス(同じサイズ、同じプレフィックス、同じMD5の2つのファイル)に基づいて、無数の衝突ファイル(同じプレフィックス、異なる衝突ブロック、同じサフィックスを持つ)を生成できます
ミカルアンブロズ

-1

2つのバイナリファイルが同じかどうかを確認する比較的簡単な方法があります。

プログラミング言語でファイルの入出力を使用する場合。両方のバイナリファイルの各ビットを独自の配列に格納できます。

この時点では、チェックは次のように簡単です。

if(file1 != file2){
    //do this
}else{
    /do that
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.