Care este cel mai simplu mod (folosind un instrument grafic sau o linie de comandă pe Ubuntu Linux) de a ști dacă două fișiere binare sunt identice sau nu (cu excepția marcajelor de timp)? Nu am nevoie să extrag efectiv diferența. Am nevoie doar să știu dacă sunt identice sau nu.
Standardul unix diff
va arăta dacă fișierele sunt identice sau nu:
[[email protected] ~]$ diff 1.bin 2.bin
Binary files 1.bin and 2.bin differ
Dacă nu există nici o ieșire de la comandă, înseamnă că fișierele nu au diferențe.
- diff pare să aibă probleme cu foarte mari foarte mari. Am primit un mesaj
diff: memory exhausted
când am comparat două fișiere de 13G. – > . - Ieșire interesantă.
diff
vă spune că sunt fișiere „binare”. Din moment ce toate fișierele pot fi considerate ca fiind binare, aceasta este o afirmație ciudată. – > . - Puteți raporta fișiere identice cu opțiunea:
diff -s 1.bin 2.bin
saudiff --report-identical-files 1.bin 2.bin
Aceasta aratăFiles 1.bin and 2.bin are identical
– > . - Nu, se va spune că sunt „diferite”, deci nu sunt identice – > .
- Am două executabile, știu că sunt diferite pentru că le-am compilat și le-am rulat, dar toate opțiunile de diff și cmp date aici le judecă identice. De ce?!!! – > .
Utilizați cmp
comanda. Aceasta fie va ieși în mod curat dacă sunt egale binar, fie va tipări unde apare prima diferență și va ieși.
- Pentru cazul de utilizare descris de OP, IMHO
cmp
este mai eficientă decâtdiff
. Așadar, aș prefera acest lucru. – > . - Am un script shell care rulează:
cmp $1 $2 && echo "identical" || echo "different"
– > . - cmp-ul se oprește când a găsit prima diferență și o afișează sau merge până la sfârșitul fișierelor? – > .
cmp
are modul „silent”:-s, --quiet, --silent
–suppress all normal output
. Nu am testat încă, dar cred că se va opri la prima diferență, dacă există una. – > .
Am găsit Visual Binary Diff era ceea ce căutam, disponibil pe:
-
Ubuntu:
sudo apt install vbindiff
-
Arch Linux:
sudo pacman -S vbindiff
-
Mac OS X prin MacPorts:
port install vbindiff
-
Mac OS X prin Homebrew:
brew install vbindiff
- Nice… Credeam/că vreau doar să știu dacă fișierele diferă; dar faptul că pot vedea cu ușurință diferențele exacte este mult mai util. Avea tendința de a face segfault când ajungeam la sfârșitul fișierului, dar nu contează, tot funcționa. – > .
- S-a mai spus de câteva ori, dar acesta este un mic program grozav! (pentru informare, de asemenea, pe homebrew) – – > .
- Acesta ar trebui să fie răspunsul acceptat, deoarece este o metodă mult superioară față de rezultatul insipid și nefolositor al comenzii canonice diff. – > .
- Acesta este cel mai bun instrument pentru diff binar. – > .
Utilizați sha1 pentru a genera suma de control:
sha1 [FILENAME1]
sha1 [FILENAME2]
- Dacă ați avea o sumă de control doar pentru unul dintre fișiere, acest lucru ar fi util, dar dacă aveți ambele fișiere pe disc, nu este necesar.
diff
șicmp
vă vor spune dacă sunt diferite fără niciun efort suplimentar. – > . - Nu este
sha1sum
în loc desha1
? – > . - sha1 pe NetBSD, sha1sum pe Linux – > .
- Există două fișiere care vor returna același rezultat în ciuda faptului că sunt diferite: shattered.io – > .
- SHA1 are deja o coliziune publică (shattered.io) și probabil și unele nepublice. O singură coliziune poate fi folosită pentru a genera nenumărate fișiere care intră în coliziune Folosiți SHA2 pentru hashing în schimb, vă rog. – > .
Am sfârșit prin a folosi hexdump pentru a converti fișierele binare în reprezentarea lor hexagonală și apoi le-am deschis în meld / kompare / orice alt instrument de diferență. Spre deosebire de tine, eu căutam diferențele din fișiere.
hexdump tmp/Circle_24.png > tmp/hex1.txt
hexdump /tmp/Circle_24.png > tmp/hex2.txt
meld tmp/hex1.txt tmp/hex2.txt
- Utilizați
hexdump -v -e '/1 "%02x
dacă doriți să faceți diff și să vedeți exact ce octeți au fost introduși sau eliminați. – > .
"' - Meld funcționează și cu fișiere binare atunci când acestea nu sunt convertite mai întâi în hexazecimal. Afișează valorile hexagonale pentru lucrurile care nu se află în setul de caractere, în rest caractere normale, ceea ce este util în cazul fișierelor binare care conțin și text ascii. Multe dintre acestea, cel puțin încep cu un șir magic. – > .
Puteți folosi funcția hash MD5 pentru a verifica dacă două fișiere sunt identice, cu aceasta nu puteți vedea diferențele la nivel scăzut, dar este o modalitate rapidă de a compara două fișiere.
md5 <filename1>
md5 <filename2>
Dacă ambele hash-uri MD5 (ieșirea comenzii) sunt identice, atunci, cele două fișiere nu sunt diferite.
- Poți să ne explici, te rog, cum se explică voturile tale negative? SHA1 are 4 voturi în plus, iar dacă OP crede că există o șansă ca cele două fișiere să fie identice sau similare, șansele de coliziune sunt mici și nu merită să votezi în minus MD5 și să votezi în plus SHA1, decât pentru că ai auzit că ar trebui să folosești parolele cu SHA1 în loc de MD5 (asta e o problemă diferită). – > .
- nu sunt sigur de motiv, dar un cmp pur va fi mai eficient decât calcularea oricărei funcții hash a fișierelor și compararea lor (cel puțin pentru doar 2 fișiere) – – > .
- dacă cele două fișiere sunt mari și se află pe același disc (nu ssd), varianta md5 sau sha* ar putea fi mai rapidă, deoarece discurile pot citi cele două fișiere secvențial, ceea ce economisește multe mișcări de cap. – > .
- Am dat downvoted pentru că ai postat o variantă minoră a unei soluții anterioare (proaste), când ar fi trebuit să fie un comentariu. – > .
- Cel mai rapid mod de a verifica fișiere mari 🙂 Mulțumesc mult – > .
Utilizați comanda cmp. Consultați Fișiere binare și forțarea comparațiilor de text pentru mai multe informații.
cmp -b file1 file2
-b
nu compară fișiere în „modul binar”. De fapt, „Cu GNUcmp
, , puteți utiliza, de asemenea, funcția-b
sau--print-bytes
pentru a afișa reprezentarea ASCII a acelor octeți.”. Este exact ceea ce am găsit folosind URL-ul la manualul pe care l-ați furnizat. – > .- Victor Yarema, nu știu la ce vă referiți prin „mod binar”.
cmp
este în mod inerent o comparație binară în opinia mea. Pe-b
opțiune nu face decât să tipărească primul octet care este diferit. – > .
Pentru a găsi defecte în memoria flash, a trebuit să scriu acest script care arată toate blocurile de 1K care conțin diferențe (nu doar primul ca cmp -b
o face)
#!/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
" $i "$r"
fi
i=$(expr $i + 1024)
done
Ieșire:
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 $
Disclaimer: Am hackuit scriptul în 5 min. Nu suportă argumente în linia de comandă și nici spații în numele fișierelor
- Primesc „r: not found” (folosind GNU linux) – > .
- @unseen_rider care shell, care linie? Vă rugăm să apelați scriptul folosind
sh -x
pentru depanare – > . - Acest lucru se face prin apelarea scriptului din terminal. Linia este 9. – > .
- @unseen_rider Nu te pot ajuta în acest fel. Scriptul este în regulă. Vă rugăm să postați ieșirea de depanare la pastebin.com. Puteți vedea aici ce vreau să spun: pastebin.com/8trgyF4A. De asemenea, vă rog să-mi spuneți și mie rezultatul de
readlink -f $(which sh)
– > . - Ultima comandă dă
/bin/dash
. În prezent creez paste pe pastebin. – > .
Diff cu următoarele opțiuni ar face o comparație binară pentru a verifica doar dacă fișierele sunt diferite și ar ieși dacă fișierele sunt la fel de bine:
diff -qs {file1} {file2}
Dacă comparați două fișiere cu același nume în directoare diferite, puteți folosi în schimb acest formular:
diff -qs {file1} --to-file={dir2}
OS X El Capitan
Încercați diff -s
Răspuns scurt: rulați diff
cu opțiunea -s
comutator.
Răspuns lung: citiți mai jos.
Iată un exemplu. Să începem prin a crea două fișiere cu conținut binar aleatoriu:
$ 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
Acum să facem o copie a primului fișier:
$ cp test1.bin copyoftest1.bin
Acum test1.bin și test2.bin ar trebui să fie diferite:
$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ
… și test1.bin și copioftest1.bin ar trebui să fie identice:
$ diff test1.bin copyoftest1.bin
Dar așteptați! De ce nu există nici o ieșire?!?
Răspunsul este: acest lucru este proiectat. Nu există ieșire pentru fișiere identice.
Dar există coduri de eroare diferite:
$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ
$ echo $?
1
$ diff test1.bin copyoftest1.bin
$ echo $?
0
Din fericire, nu trebuie să verificați codurile de eroare de fiecare dată, pentru că puteți folosi pur și simplu funcția -s
(sau --report-identical-files
) pentru a face ca diff să fie mai verbos:
$ diff -s test1.bin copyoftest1.bin
Files test1.bin and copyoftest1.bin are identical
Radiff2 este un instrument conceput pentru a compara fișiere binare, similar cu modul în care diff obișnuit compară fișiere text.
Încercați radiff2
care face parte din radare2
dezasamblorator. De exemplu, cu această comandă:
radiff2 -x file1.bin file2.bin
Veți obține o ieșire destul de formatată pe două coloane în care sunt evidențiate diferențele.
Preferatele mele folosesc xxd hex-dumper din pachetul vim :
1) folosind vimdiff (parte din vim)
#!/bin/bash
FILE1="$1"
FILE2="$2"
vimdiff <( xxd "$FILE1" ) <( xxd "$FILE2" )
2) folosind diff
#!/bin/bash
FILE1=$1
FILE2=$2
diff -W 140 -y <( xxd $FILE1 ) <( xxd $FILE2 ) | colordiff | less -R -p ' | '
md5sum binary1 binary2
Dacă suma md5 este aceeași, binarele sunt aceleași
De ex.
md5sum new*
89c60189c3fa7ab5c96ae121ec43bd4a new.txt
89c60189c3fa7ab5c96ae121ec43bd4a new1.txt
[email protected]:~# cat new*
aa55 aa55 0000 8010 7738
aa55 aa55 0000 8010 7738
[email protected]:~# cat new*
aa55 aa55 000 8010 7738
aa55 aa55 0000 8010 7738
[email protected]:~# md5sum new*
4a7f86919d4ac00c6206e11fca462c6f new.txt
89c60189c3fa7ab5c96ae121ec43bd4a new1.txt
- Nu chiar. Doar că posibilitatea este mare. – > .
- Care este probabilitatea de a eșua ? – > .
- Slabă, dar mai rea decât folosirea unei variante de
diff
, , față de care nu există niciun motiv pentru a o prefera. – > . - Ar trebui să schimbați hash-ul MD5 în SHA2 pentru ca acest sfat să fie practic. Laptopul oricui poate genera în aceste zile o coliziune în MD5 și pe baza acestui singur prefix de coliziune (2 fișiere de aceeași mărime, cu același prefix și același MD5) să genereze un număr infinit de fișiere care intră în coliziune (având același prefix, blocuri de coliziune diferite, același sufix) – -. > .
Există o modalitate relativ simplă de a verifica dacă două fișiere binare sunt identice.
Dacă folosiți intrarea/ieșirea fișierelor într-un limbaj de programare; puteți stoca fiecare bit al ambelor fișiere binare în propriile lor matrici.
În acest moment, verificarea este la fel de simplă ca :
if(file1 != file2){
//do this
}else{
/do that
}
cmp
spune în mod specific că face o comparație octet cu octet, așa că aceasta este opțiunea mea implicită pentru 2 fișiere binare.diff
este linie cu linie și vă va da același răspuns de tip Da/Nu, dar, desigur, nu aceeași descărcare pe fluxul de ieșire standard. În cazul în care liniile sunt lungi, pentru că poate nu sunt fișiere text, atunci aș preferacmp
.diff
are avantajul că puteți specifica o comparație a directoarelor și că-r
pentru recursivitate, comparând astfel mai multe fișiere într-o singură comandă. – > Por H2ONaCl.