web-dev-qa-db-ja.com

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

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

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

37
Jon Cage

ほとんどのLinuxフレーバーに付属する解決策が見つかりました- cmpツール

17
Jon Cage

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

45
mpez0

2つのファイルが同一であるかどうかを判断する最も一般的な方法の1つ(サイズが一致していると想定)は、プログラムを使用してファイルの " ハッシュ "(基本的にはフィンガープリント)を作成することです。最も一般的なものは md5sum および sha1sum

例えば:

$ 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
21
Adam Batkin

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

それらがどのように異なるか、またはどこが異なるかを知りたい場合、機能する1つのことは、両方をクランクすることです od (「hexal dump」、通常は16進数のオプションがあります)。一時ファイルとそれらを比較します。

3
JustJeff

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

RAMキャッシングが結果に大きな影響を与えたため、4.3 GBのファイルで演習を再実行し、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を使用することをお勧めします。

1
forbidder