Linuxで同じサイズの2つのファイルでバイナリdiffを実行するにはどうすればよいですか?


37

同じサイズのファイルが2つあり、バイナリdiffを実行してそれらが同じかどうかを確認する必要があります。

現在実行中ですdiff file1.img file2.imgが、4 GBのファイルを処理するのにかなり時間がかかります。これが最も効率的な方法ですか?

回答:


45

cmpバイナリファイルの違いを見つけるように設計されています。チェックサム(sum)を試し、ハッシュを比較することもできます。


21

2つのファイルが同一であるかどうかを判断する最も一般的な方法の1つ(サイズが一致すると仮定)は、プログラムを使用してファイルの「ハッシュ」(本質的に指紋)を作成します。最も一般的なものはmd5sumsha1sumです。

例えば:

$ md5sum file1 file2
e0e7485b678a538c2815132de7f9e878  file1
4a14aace18d472709ccae3910af55955  file2

あなたは、あるシステムから別のシステムへのファイルの完全なディレクトリを転送している場合には、例えば、チェックする必要があることを多くのファイルがある場合は、ファイルへの元のシステムからの出力をリダイレクトすることができ、そしてmd5sum/ sha1sum自動的に伝えるために、そのファイルを使用することができますどのファイルが異なるか:

$ md5sum file1 file2 > MD5SUMS
... copy file1, file2, MD5SUMS across
$ md5sum --check MD5SUMS
file1: OK
file2: OK

2
MD5は、常にこのため信頼できません。digg.com/security/...
ジョン・ケージ

28
実際、MD5 基本的な整合性チェックに対して信頼性があります。かつて考えていたように、暗号的に強力とは見なされていません。ハッカーが心配な場合は、MD5を使用しないでください。ただし、CDからコピーしたファイルが破損したかどうかだけを知りたい場合や、コンパイラーが毎回同一のファイルを吐き出している場合は、MD5で十分です。
アダムバットキン


3

それらが同じであるかどうかだけを知りたい場合は、sha1sumが使用可能であればそれを使用するか、md5をフォールバックとして使用することを好みます。

それらがどの程度異なるか、どこが異なるかを知りたい場合は、一時ファイルを作成してからそれらをod(通常は16進オプションを持つ「オクタルダンプ」)で両方ともクランクすることで動作します。


2
2つのファイルが同じであるかどうかを知りたい場合は、sha1sum(またはmd5sum)を使用する方がdiff(これは元の質問であったため)よりも効率的ではないと思います大)ファイルが最初に異なる場合)、それらが異なることを知る前に、両方を完全に読みます。
ピエール14

@Pierre BUT、ハッシュおよび暗号署名は、リモートデバイス間で機能します。
VasyaNovikov

1

100 MB以上のファイルでベンチマークを実行しました。diffが最速で、cmpが2番目、md5sumが最後に使用されました。

# time diff file1 file2; echo $?

real    0m0.122s
user    0m0.009s
sys 0m0.113s
0
# time cmp file1 file2; echo $?

real    0m0.213s
user    0m0.097s
sys     0m0.117s
0
# time md5sum file1 > /tmp/test; time md5sum file2 > /tmp/test2; diff /tmp/test /tmp/test2; echo $?

real    0m0.279s
user    0m0.211s
sys     0m0.066s

real    0m0.316s
user    0m0.225s
sys     0m0.073s
0

4.3 GBのファイルを使用して演習を再実行しましたが、RAMキャッシュが結果に大きな影響を与えていたため、ddを使用してファイルを削除および再作成する必要がありました。

$time diff file1 file2; echo $?

real    0m19.325s
user    0m0.995s
sys 0m5.280s
0

$time cmp file1 file2; echo $?

real    0m36.106s
user    0m4.399s
sys 0m6.147s
0

$time md5sum file1 > /tmp/test; time md5sum file2 > /tmp/test2; diff /tmp/test /tmp/test2; echo $?

real    0m10.441s
user    0m8.054s
sys 0m2.357s

real    0m24.682s
user    0m8.027s
sys 0m3.442s
0

これらの結果に基づいて、ファイルをRAMFSマウントに移動し、diffを使用することをお勧めします。


実際にベンチマークを行ったのが好きですが、100 MbはOPのケースを代表するものではありません。1,000Mbの方がはるかに良いでしょう。
jpaugh

1
数か月後に4.3ギグテストを実行した理由はこれです。実際には、OSキャッシングをバイパスするのに手間がかかりました。
禁止者

そうだと思います。答えの途中で読んでいないことをおIびします。(まだ最初のベンチマークを見ただけでも、それで十分に投票できると思っていました。)FWIW、ファイルキャッシングを無効にするためのカーネルマジックがあります。どのベンチマークが実際に機能するか、または必要であるかを確認するには、自分でベンチマークを実行する必要があります。
jpaugh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.