İkili dosyaları aynı olup olmadığını kontrol etmek için nasıl karşılaştırılır?


186

İki ikili dosyanın aynı olup olmadığını (zaman damgaları hariç) bilmenin en kolay yolu nedir (Ubuntu Linux'ta bir grafik aracı veya komut satırı kullanarak)? Aslında farkı çıkarmam gerekmiyor. Sadece aynı olup olmadıklarını bilmem gerek.


5
Nasıl farklı olduklarını göstermek isteyen bir soru : superuser.com/questions/125376/…
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

2
Man sayfası cmpözellikle bir bayt bayt karşılaştırması yaptığını söylüyor, bu yüzden 2 ikili dosya için benim varsayılanım. diffsatır satır ve size aynı Evet / Hayır yanıtı verecek ama tabii ki standart çıkış akışı aynı dökümü değil. Çizgiler uzunsa, belki de metin dosyaları olmadıkları için tercih ederim cmp. diff, -rbir komutta birden çok dosyayı karşılaştırarak dizinlerin ve özyineleme için bir karşılaştırma belirtebilme avantajına sahiptir .
H2ONaCl

Yanıtlar:


180

Standart unix diff, dosyaların aynı olup olmadığını gösterir:

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

Komuttan çıktı yoksa, dosyaların farkı yoktur.


5
diff, gerçekten büyük dosyalarla sorun yaşıyor gibi görünüyor . diff: memory exhaustedİki 13G dosyasını karşılaştırırken bir tane aldım .
Yongwei Wu

1
İlginç çıktı. diffsize "ikili" düşmanlar olduklarını söylüyor. Tüm dosyalar ikili olarak kabul edilebildiğinden, bu garip bir iddiadır.
H2ONaCl

7
Aynı dosyaları seçenekle bildirebilirsiniz: diff -s 1.bin 2.binveya diff --report-identical-files 1.bin 2.binBu şovFiles 1.bin and 2.bin are identical
Tom Kuschel

1
Hayır, "farklı" olduklarını söyleyecekler, bu yüzden aynı değiller
Josef Klimuk

1
İki yürütülebilir dosyam var, farklı olduklarını biliyorum çünkü onları derledim ve çalıştırdım, ancak burada verilen diff ve cmp'nin tüm seçenekleri aynı olduğunu yargılar. Neden? !!!
mirkastath

107

cmpKomutu kullan . Bu, ikili eşitlerse temiz bir şekilde çıkacaktır veya ilk farkın oluştuğu yeri yazdıracak ve çıkacaktır.


9
Kullanım durumu için OP, IMHO'nun cmpdaha verimli olduğunu açıklar diff. Bu yüzden bunu tercih ederim.
halloleo

5
Ben çalıştıran bir kabuk komut dosyası var:cmp $1 $2 && echo "identical" || echo "different"
steveha

2
farkı bulduğunda cmp durur ve görüntüler mi yoksa dosyaların sonuna gider mi?
sop

cmp"sessiz" moduna sahiptir: -s, --quiet, --silent- suppress all normal output. Henüz test etmedim ama sanırım ilk farkta duracak.
Victor Yarema

90

Visual Binary Diff aradığım şey, buldum :

  • Ubuntu:

    sudo apt install vbindiff
    
  • Arch Linux:

    sudo pacman -S vbindiff
    
  • MacPorts üzerinden Mac OS X :

    port install vbindiff
    
  • Homebrew üzerinden Mac OS X:

    brew install vbindiff
    

1
Güzel ... Ben / düşünce / Sadece dosyaların farklı olup olmadığını bilmek istedim; ancak kesin farkları kolayca görebilmek çok daha faydalı oldu. Dosyanın sonuna geldiğimde segfault eğilimi gösterdi, ama boşver, hala işe yaradı.
Jeremy

2
Birkaç kez söylendi, ama bu harika bir küçük program! (
fyi

2
Kanonik diff komutunun yumuşak ve yararsız çıktısından çok daha üstün bir yöntem olduğu için bu kabul edilen cevap olmalıdır.
Gearoid Murphy

1
Bu ikili fark için en iyi araçtır.
Carla Camargo

17

Sağlama toplamı oluşturmak için sha1 kullanın:

sha1 [FILENAME1]
sha1 [FILENAME2]

3
Dosyalardan biri için yalnızca bir sağlama toplamı varsa, bu yararlı olacaktır, ancak diskte her iki dosya varsa bu gereksizdir. diffve cmpher ikisi de ekstra çaba harcamadan farklılık gösterip göstermediklerini söyleyecektir.
johncip

1
Bunun sha1sumyerine değil sha1mi?
kol

2
NetBSD'de sha1, Linux'ta sha1sum
Scott Presnell

2
Farklı olmasına rağmen aynı sonucu döndürecek iki dosya vardır: shattered.io
mik

2
SHA1'in zaten bir halk çarpışması ( shattered.io ) ve muhtemelen bazı halka açık olmayan çarpışmaları var . Bir çarpışma sayısız çarpışma dosyası oluşturmak için kullanılabilir. Bunun yerine lütfen karma için SHA2 kullanın.
Michal Ambroz

12

Ben ikili dosyaları orada hex temsil dönüştürmek için hexdump kullanarak sona erdi ve daha sonra meld / kompare / herhangi bir fark aracında açtı. Senden farklı olarak dosyalardaki farklılıkların peşindeydim.

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"'Hangi baytların takıldığını veya çıkarıldığını görmek ve farklılaştırmak istiyorsanız kullanın .
William Entriken

Meld ayrıca ilk olarak onaltılık biçime dönüştürülmediğinde ikili dosyalarla da çalışır. Karakter kümesinde olmayan şeyler için onaltılık değerler, aksi takdirde bazı ASCII metin içeren ikili dosyalar için yararlı olan normal karakterleri gösterir. Birçoğu, en azından sihirli bir dize ile başlar.
Felix Dombek

8

İki dosyanın aynı olup olmadığını kontrol etmek için MD5 karma işlevini kullanabilirsiniz, bununla farkları düşük düzeyde göremezsiniz, ancak iki dosyayı karşılaştırmanın hızlı bir yoludur.

md5 <filename1>
md5 <filename2>

Her iki MD5 karması da (komut çıkışı) aynıysa, iki dosya farklı değildir.


7
Aşağı oylarınızı açıklayabilir misiniz lütfen? SHA1'in 4 oyu var ve eğer OP iki dosyanın aynı veya benzer olma şansı olduğunu düşünüyorsa, bir çarpışma şansı azdır ve MD5'i oylamaya layık değildir, ancak SHA1'e oy vermeniz gerektiğini duymanız dışında MD5 yerine SHA1 ile şifreler (bu farklı bir sorundur).
Rikki

2
nedeni hakkında emin değilim ama saf bir cmp dosyaların herhangi bir karma fonksiyon hesaplamak ve bunları karşılaştırmak daha verimli olacaktır (en az sadece 2 dosya için)
Paweł Szczur 26:16

1
iki dosya büyükse ve aynı diskte (ssd değil), md5 veya sha * varyantı daha hızlı olabilir, çünkü diskler iki dosyayı sırayla okuyabilir, bu da çok fazla kafa hareketi kaydeder
Daniel Alder

7
Daha önce (kötü) bir çözümün küçük bir varyantını yorumladığınız için indirdiniz çünkü.
johncip

6

Cmp komutunu kullanın. Daha fazla bilgi için bkz. İkili Dosyalar ve Zorunlu Metin Karşılaştırmaları .

cmp -b file1 file2

1
-b"ikili mod" daki dosyaları karşılaştırmaz. Aslında "GNU ile cmp, bu baytların ASCII temsilini göstermek için -bveya --print-bytesseçeneğini de kullanabilirsiniz ." Bu, sağladığınız kılavuzun URL'sini kullanarak bulduğum şeydir.
Victor Yarema

Victor Yarema, "ikili mod" ile ne demek istediğini bilmiyorum. cmpbence doğal olarak ikili bir karşılaştırmadır. Bu -bseçenek yalnızca farklı olan ilk baytı yazdırır.
H2ONaCl

4

Flash bellek hatalarını bulmak için, farklılıklar içeren tüm 1K bloklarını gösteren bu komut dosyasını yazmak zorunda kaldım (sadece ilkini değil 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

Çıktı:

   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 $

Yasal Uyarı: Senaryoyu 5 dakika içinde hackledim. Komut satırı bağımsız değişkenlerini veya dosya adlarındaki boşlukları desteklemez


"R: bulunamadı" (GNU linux kullanarak)
alıyorum

@ unseen_rider hangi kabuk, hangi çizgi? Lütfen sh -xhata ayıklama için komut dosyasını arayın
Daniel Alder

Bu komut dosyasını terminalden çağırmaktır. Satır 9
unseen_rider

@unseen_rider Size bu şekilde yardım edemem. Senaryo tamam. Lütfen hata ayıklama çıktısını pastebin.com adresine gönderin . Burada ne demek istediğimi görebilirsiniz: pastebin.com/8trgyF4A . Ayrıca, lütfen bana çıktısını söylereadlink -f $(which sh)
Daniel Alder

Son komut verir /bin/dash. Şu anda macun üzerine macun oluşturuluyor.
unseen_rider

4

Aşağıdaki seçeneklerle fark, dosyaların tamamen farklı olup olmadığını kontrol etmek için ikili bir karşılaştırma yapacaktır ve dosyalar da aynı ise çıktı verecektir:

diff -qs {file1} {file2}

Farklı dizinlerde aynı ada sahip iki dosyayı karşılaştırıyorsanız, bu formu kullanabilirsiniz:

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

OS X El Capitan


3

Diff -s komutunu deneyin

Kısa cevap: çalıştırmak diffile -sanahtarı.

Uzun cevap: aşağıda okuyun.


İşte bir örnek. Rastgele ikili içerikli iki dosya oluşturarak başlayalım:

$ 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

Şimdi ilk dosyanın bir kopyasını yapalım:

$ cp test1.bin copyoftest1.bin

Şimdi test1.bin ve test2.bin farklı olmalı:

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

... ve test1.bin ve copyoftest1.bin aynı olmalıdır:

$ diff test1.bin copyoftest1.bin

Fakat bekle! Neden çıktı yok?!?

Cevap: bu tasarım gereğidir. Aynı dosyalar üzerinde çıktı yok.

Ancak farklı hata kodları vardır:

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

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

Neyse ki her seferinde hata kodlarını kontrol etmek zorunda değilsiniz, çünkü diff'i daha ayrıntılı yapmak için -s(veya --report-identical-files) anahtarını kullanabilirsiniz:

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

2

Radiff2 ikili farkları karşılaştırmak için tasarlanmış, normal diff'in metin dosyalarını karşılaştırmasına benzer bir araçtır.

radiff2Hangi radare2sökücünün bir parçası olduğunu deneyin . Örneğin, bu komutla:

radiff2 -x file1.bin file2.bin

Farklılıkların vurgulandığı oldukça biçimlendirilmiş iki sütun çıktısı alırsınız.


1

Vim paketinden xxd hex-dumper kullanarak en sevdiklerim:

1) vimdiff kullanma (vim'in bir parçası)

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

2) fark kullanma

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

0
md5sum binary1 binary2

Md5sum aynı ise, ikili dosyalar aynıdır

Örneğin

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
Pek değil. Sadece olasılık yüksektir.
sawa

Başarısız olma olasılığı nedir?
ashish

İnce, ancak difftercih etmek için bir neden olmayan bazı varyantlarını kullanmaktan daha kötü .
sawa

Bu tavsiyenin pratik olması için MD5 karma değerini SHA2 olarak değiştirmeniz gerekir. Herkesin dizüstü bilgisayarı bu günlerde MD5'te çarpışma oluşturabilir ve bu tek çarpışma önekine (aynı boyutta, aynı önekte ve aynı MD5'te 2 dosya) sonsuz sayıda çarpışan dosya oluşturmak için (aynı önek, farklı çarpışma bloğu, aynı sonek)
Michal Ambroz

-1

İki ikili dosyanın aynı olup olmadığını kontrol etmenin nispeten basit bir yolu vardır.

Dosya giriş / çıkışını bir programlama dilinde kullanıyorsanız; her iki ikili dosyanın her bir bitini kendi dizilerine kaydedebilirsiniz.

Bu noktada kontrol aşağıdaki kadar basittir:

if(file1 != file2){
    //do this
}else{
    /do that
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.