बाइनरी फ़ाइलों की तुलना करने के लिए कि क्या वे समान हैं?


186

यह जानने का सबसे आसान तरीका क्या है (उबंटू लिनक्स पर एक ग्राफिकल टूल या कमांड लाइन का उपयोग करके) यह जानने के लिए कि क्या दो बाइनरी फाइलें समान हैं या नहीं (समय टिकटों को छोड़कर)? मुझे वास्तव में अंतर निकालने की आवश्यकता नहीं है। मुझे सिर्फ यह जानने की जरूरत है कि वे समान हैं या नहीं।


5
एक सवाल जो यह बताता है कि वे कैसे भिन्न हैं: superuser.com/questions/125376/…
Ciro Santilli 病 how how how

2
मैन पेज cmpविशेष रूप से कहता है कि यह बाइट तुलना द्वारा एक बाइट करता है ताकि 2 बाइनरी फ़ाइलों के लिए मेरा डिफ़ॉल्ट हो। diffलाइन से लाइन है और आपको वही हाँ / नहीं का जवाब देगा लेकिन निश्चित रूप से मानक आउट स्ट्रीम के समान डंप नहीं है। यदि लाइनें लंबी हैं क्योंकि शायद वे पाठ फ़ाइलें नहीं हैं तो मैं पसंद करूंगा cmpdiffइसका लाभ यह है कि आप निर्देशिकाओं की तुलना और -rपुनरावृत्ति के लिए एक कमांड में कई फाइलों की तुलना कर सकते हैं।
H2ONaCl

जवाबों:


180

मानक यूनिक्स diffदिखाएगा कि क्या फाइलें समान हैं या नहीं:

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

यदि कमांड से कोई आउटपुट नहीं है, तो इसका मतलब है कि फ़ाइलों में कोई अंतर नहीं है।


5
लगता है कि वास्तव में बड़ी फ़ाइलों के साथ समस्याएँ हैं । मुझे diff: memory exhaustedदो 13G फाइलों की तुलना करने पर मिला ।
योंगवेई वू

1
दिलचस्प उत्पादन। diffआपको बता रहा है कि वे "बाइनरी" हैं। चूंकि सभी फाइलों को द्विआधारी माना जा सकता है, इसलिए यह एक अजीब दावा है।
H2ONaCl

6
आप विकल्प के साथ समान फ़ाइलों की रिपोर्ट कर सकते हैं: diff -s 1.bin 2.binया diff --report-identical-files 1.bin 2.binयह दिखाता हैFiles 1.bin and 2.bin are identical
टॉम कुशेल

1
नहीं, यह कहेंगे कि वे "भिन्न" हैं, इसलिए वे समान नहीं हैं
जोसेफ क्लिमुक

1
मेरे पास दो निष्पादन योग्य हैं, मुझे पता है कि वे अलग-अलग हैं क्योंकि मैंने उन्हें संकलित किया और उन्हें दौड़ाया, लेकिन यहां दिए गए अंतर और सीएमपी के सभी विकल्प उन्हें समान दर्शाते हैं। क्यों? !!!
मोरकास्तथ

107

cmpकमांड का उपयोग करें । यह या तो स्वच्छ रूप से बाहर निकल जाएगा यदि वे बाइनरी बराबर हैं, या यह प्रिंट आउट करेगा जहां पहला अंतर होता है और बाहर निकलता है।


9
उपयोग के मामले में ओपी का वर्णन IMHO cmpकी तुलना में अधिक कुशल है diff। इसलिए मैं इसे पसंद करूंगा।
आधा

5
मेरे पास एक शेल स्क्रिप्ट है जो चलती है:cmp $1 $2 && echo "identical" || echo "different"
स्टीवेहा

2
जब यह पहला अंतर पाया जाता है, तो cmp बंद हो जाता है और इसे प्रदर्शित करता है या यह फाइलों के अंत में चला जाता है?
एसओपी

cmp"मूक" मोड है: -s, --quiet, --silent- suppress all normal output। मैंने अभी तक परीक्षण नहीं किया है, लेकिन मुझे लगता है कि अगर यह एक है तो यह पहले अंतर पर रोक देगा।
विक्टर यारमा

89

मुझे दृश्य बाइनरी डिफ मिल गया था, जिसे मैं देख रहा था:

  • उबंटू:

    sudo apt install vbindiff
    
  • आर्क लिनक्स:

    sudo pacman -S vbindiff
    
  • Mac OS X MacPorts के माध्यम से :

    port install vbindiff
    
  • होमब्रे के माध्यम से मैक ओएस एक्स:

    brew install vbindiff
    

1
अच्छा ... मुझे लगा / मैं केवल जानना चाहता हूं कि क्या फाइलें अलग थीं; लेकिन आसानी से सटीक अंतर देखने में सक्षम होना बहुत अधिक उपयोगी था। जब मैं फ़ाइल के अंत में पहुंच गया, तो यह segfault पर टिक गया, लेकिन कोई बात नहीं, यह अभी भी काम कर रहा था।
जेरेमी

2
यह कुछ बार कहा गया है, लेकिन यह एक महान कार्यक्रम है! (
होमबेव

2
यह स्वीकृत उत्तर होना चाहिए क्योंकि यह कैनोनिकल डिफरेंशियल कमांड के ब्लैंड और अनफ्लोफुल आउटपुट की तुलना में कहीं अधिक बेहतर विधि है।
गायरॉइड मर्फी

1
यह द्विआधारी अंतर के लिए सबसे अच्छा उपकरण है।
कार्ला कैमारगो

17

चेकसम उत्पन्न करने के लिए sha1 का उपयोग करें:

sha1 [FILENAME1]
sha1 [FILENAME2]

3
यदि आपके पास केवल एक फाइल के लिए एक चेकसम है, तो यह उपयोगी होगा, लेकिन अगर आपके पास डिस्क पर दोनों फाइलें हैं तो यह अनावश्यक है। diffऔर cmpदोनों आपको बताएंगे कि क्या वे बिना किसी अतिरिक्त प्रयास के अलग हैं।
23

1
इसके sha1sumबजाय नहीं है sha1?
kol

2
NetBSD पर sha1, Linux पर sha1sum
स्कॉट प्रीनेल

2
दो फाइलें हैं जो अलग होने के बावजूद एक ही परिणाम
लौटाएंगी

2
SHA1 में पहले से ही एक सार्वजनिक टक्कर है ( बिखर गया ) और शायद कुछ गैर-सार्वजनिक भी। एक टकराव का उपयोग कई टकराने वाली फ़ाइलों को उत्पन्न करने के लिए किया जा सकता है। कृपया इसके बजाय हैशिंग के लिए SHA2 का उपयोग करें।
मीकल अम्ब्रोज़

12

मैंने हेक्सडंप का उपयोग करके बाइनरी फ़ाइलों को हेक्स प्रतिनिधित्व में बदलने के लिए हेक्सडंप का उपयोग किया और फिर उन्हें मेल्ड / कोम्पर / अन्य किसी अन्य उपकरण में खोला। आपके विपरीत मैं फाइलों में अंतर के बाद था।

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"'यदि आप अंतर करना चाहते हैं और वास्तव में देखें कि कौन से बाइट्स डाले या हटाए गए हैं, तो उपयोग करें
विलियम एंट्रिएन

जब वे पहले हेक्स में परिवर्तित नहीं होते हैं तो बाइनरी फाइलों के साथ मेल्ड भी काम करता है। यह उन चीज़ों के लिए हेक्स मूल्यों को दिखाता है जो चार सेट में नहीं हैं, अन्यथा सामान्य वर्ण, जो बाइनरी फ़ाइलों के साथ उपयोगी है जिसमें कुछ असेंबल पाठ भी शामिल हैं। कई करते हैं, कम से कम एक जादुई स्ट्रिंग के साथ शुरू करते हैं।
फेलिक्स डॉम्बेक

7

आप एमडी 5 हैश फंक्शन का उपयोग यह जांचने के लिए कर सकते हैं कि क्या दो फाइलें समान हैं, इसके साथ आप कम स्तर में अंतर नहीं देख सकते हैं, लेकिन दो फाइलों की तुलना करने का एक त्वरित तरीका है।

md5 <filename1>
md5 <filename2>

यदि दोनों एमडी 5 हैश (कमांड आउटपुट) समान हैं, तो, दोनों फाइलें अलग नहीं हैं।


7
क्या आप अपने डाउन वोट को समझा सकते हैं? SHA1 में 4 अपवोट हैं, और यदि ओपी को लगता है कि एक मौका है कि दो फाइलें समान या समान हो सकती हैं, तो टकराव की संभावना मामूली होती है और नीचे वोटिंग एमडी 5 के योग्य नहीं होती है, लेकिन वोटिंग SHA1 के अलावा और कुछ नहीं क्योंकि आपने सुना है कि आपके पास हैश होना चाहिए MD5 के बजाय SHA1 के साथ पासवर्ड (यह एक अलग समस्या है)।
रिक्की

2
कारण के बारे में निश्चित नहीं है, लेकिन एक शुद्ध cmp फ़ाइलों के किसी भी हैश फ़ंक्शन की गणना करने और उनकी तुलना करने से अधिक कुशल होगा (कम से कम केवल 2 फ़ाइलों के लिए)
Paweł Szczur

1
अगर दो फाइलें बड़ी हैं और एक ही डिस्क पर (ssd नहीं), md5 या sha * वैरिएंट तेजी से हो सकता है क्योंकि डिस्क दो फाइलों को क्रमिक रूप से पढ़ सकती है जो बहुत सारी हेड मूवमेंट्स को बचाता है
डैनियल एल्डर

7
मैंने अस्वीकृत कर दिया क्योंकि आपने पहले (खराब) समाधान का मामूली संस्करण पोस्ट किया था, जब यह एक टिप्पणी होनी चाहिए थी।
10

6

Cmp कमांड का उपयोग करें। अधिक जानकारी के लिए बाइनरी फ़ाइलों और मजबूर पाठ तुलनाओं का संदर्भ लें ।

cmp -b file1 file2

1
-b"बाइनरी मोड" में फ़ाइलों की तुलना नहीं करता है। यह वास्तव में "जीएनयू के साथ cmp, आप उन बाइट्स के एएससीआईआई प्रतिनिधित्व को दिखाने के लिए विकल्प -bया --print-bytesविकल्प का भी उपयोग कर सकते हैं ।" यह वही है जो मैंने URL का उपयोग करके मैन्युअल रूप से दिया है जो आपने प्रदान किया है।
विक्टर यारमा

विक्टर यारेमा, मुझे नहीं पता कि "बाइनरी मोड" से आपका क्या मतलब है। 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 मिला" (GNU linux का उपयोग करके)
unseen_rider

@unseen_rider कौन सा शेल, कौन सी लाइन? कृपया sh -xडिबगिंग के लिए स्क्रिप्ट का उपयोग करके कॉल करें
डैनियल एल्डर

यह टर्मिनल से स्क्रिप्ट को कॉल करने के माध्यम से है। लाइन 9 है।
अनदेखी

@unseen_rider मैं आपकी इस तरह से मदद नहीं कर सकता। स्क्रिप्ट ठीक है। कृपया अपने डिबग आउटपुट को pastebin.com पर पोस्ट करें । आप यहां देख सकते हैं कि मेरा क्या मतलब है: pastebin.com/8trgyF4A । इसके अलावा, कृपया मुझे बताएंreadlink -f $(which sh)
डैनियल एल्डर

आखिरी आज्ञा देता है /bin/dash। वर्तमान में पेस्टिन पर पेस्ट बना रहे हैं।
अनदेखी

4

निम्न विकल्पों के साथ मुश्किल यह जांचने के लिए कि क्या फाइलें बिल्कुल अलग हैं और अगर फाइल एक जैसी है तो यह आउटपुट देगा, बाइनरी तुलना करना

diff -qs {file1} {file2}

यदि आप अलग-अलग निर्देशिकाओं में एक ही नाम वाली दो फाइलों की तुलना कर रहे हैं, तो आप इस फॉर्म का उपयोग कर सकते हैं:

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

OS X El Capitan


3

अलग-अलग कोशिश करें

संक्षिप्त उत्तर: स्विच के diffसाथ चलाएँ -s

दीर्घ उत्तर: नीचे पढ़ें।


यहाँ एक उदाहरण है। आइए यादृच्छिक द्विआधारी सामग्री के साथ दो फाइलें बनाकर शुरू करें:

$ 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 -s test1.bin copyoftest1.bin
Files test1.bin and copyoftest1.bin are identical

2

रेडिफ 2 एक उपकरण है जिसे बाइनरी फ़ाइलों की तुलना करने के लिए डिज़ाइन किया गया है, यह समान है कि पाठ फ़ाइलों की तुलना में नियमित रूप से कैसे भिन्न होता है।

कोशिश करें radiff2जो radare2disassembler का एक हिस्सा है । उदाहरण के लिए, इस आदेश के साथ:

radiff2 -x file1.bin file2.bin

आप सुंदर स्वरूपित दो कॉलम आउटपुट प्राप्त करते हैं जहां अंतर हाइलाइट किए जाते हैं।


1

Vim पैकेज से xxd हेक्स-डम्पर का उपयोग करने वाले मेरे पसंदीदा:

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
काफी नहीं। केवल संभावना अधिक है।
आरा जनता

असफलता की संभावना क्या है?
आशीष

पतला, लेकिन कुछ प्रकार का उपयोग करने से भी बदतर है diff, जिस पर इसे पसंद करने का कोई कारण नहीं है।
आरा

इस सलाह को व्यावहारिक बनाने के लिए आपको MD5 हैश को SHA2 में बदलना होगा। किसी का भी लैपटॉप इन दिनों MD5 में टकराव उत्पन्न कर सकता है और इस एकल टक्कर उपसर्ग (समान आकार, समान उपसर्ग और MD5 की 2 फाइलें) के आधार पर टकराव की अनंत संख्या उत्पन्न करने के लिए (एक ही उपसर्ग, विभिन्न टकराने वाले ब्लॉक, एक ही प्रत्यय)
मिशाल अम्ब्रोज़

-1

यह जांचने का एक सरल तरीका है कि क्या दो बाइनरी फाइलें समान हैं।

यदि आप एक प्रोग्रामिंग भाषा में फ़ाइल इनपुट / आउटपुट का उपयोग करते हैं; आप दोनों बाइनरी फ़ाइलों के प्रत्येक बिट को अपनी सरणियों में संग्रहीत कर सकते हैं।

इस बिंदु पर चेक उतना ही सरल है:

if(file1 != file2){
    //do this
}else{
    /do that
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.