বাইনারি ফাইলগুলি একই কিনা তা যাচাই করতে কীভাবে তুলনা করবেন?


186

দুটি বাইনারি ফাইল একই বা না (টাইম স্ট্যাম্প ব্যতীত) তা জানার সবচেয়ে সহজ উপায় (উবুন্টু লিনাক্সে গ্রাফিকাল সরঞ্জাম বা কমান্ড লাইন ব্যবহার করে) কোনটি? আমার আসলে পার্থক্যটি বের করার দরকার নেই। আমার জানা দরকার যে তারা একই কি না।


5
তারা কীভাবে পৃথক হয় তা দেখানোর জন্য জিজ্ঞাসা করা একটি প্রশ্ন : superuser.com/questions/125376/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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দুটি 13 জি ফাইলের সাথে তুলনা করার সময় আমি পেয়েছি ।
ইওংওয়ে উ

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
আমার দুটি এক্সিকিউটেবল রয়েছে, আমি জানি যে তারা আলাদা because কারণ আমি সেগুলি সংকলন করে চালিত করেছি, তবে এখানে প্রদত্ত ডিফ এবং সিএমপির সমস্ত বিকল্প তাদের অভিন্ন বলে বিচার করে। কেন? !!!
মিরকাসাথ

107

cmpকমান্ড ব্যবহার করুন । এটি হয় দ্বি-সমান সমান হলে পরিষ্কারভাবে প্রস্থান করবে বা প্রথম পার্থক্যটি ঘটে যেখানে প্রিন্ট হবে এবং প্রস্থান করবে।


9
ব্যবহারের ক্ষেত্রে জন্য ওপি বর্ণনা এই প্রোগ্রামটিতে cmpঅধিক কার্যকরী হয় diff। সুতরাং আমি এই পছন্দ করব।
হলিওলো

5
আমার কাছে একটি শেল স্ক্রিপ্ট রয়েছে যা চালায়:cmp $1 $2 && echo "identical" || echo "different"
স্টিভেহা

2
যখন প্রথম পার্থক্যটি পাওয়া গেল তখন কি সিএমপি থামবে, এবং এটি প্রদর্শন করবে বা এটি ফাইলগুলির শেষের মধ্য দিয়ে যায়?
রুটির

cmp"নীরব" মোড আছে: -s, --quiet, --silent- suppress all normal output। আমি এখনও পরীক্ষা করিনি তবে আমি মনে করি যে যদি এটি থাকে তবে এটি প্রথম পার্থক্যে থামবে।
ভিক্টর ইয়ারেমা

89

আমি ভিজুয়াল বাইনারি ডিফটি পেয়েছিলাম যা আমি সন্ধান করছিলাম এটি উপলভ্য:

  • উবুন্টু:

    sudo apt install vbindiff
    
  • আর্চ লিনাক্স:

    sudo pacman -S vbindiff
    
  • ম্যাকপোর্টের মাধ্যমে ম্যাক ওএস এক্স :

    port install vbindiff
    
  • হোমব্রিউয়ের মাধ্যমে ম্যাক ওএস এক্স:

    brew install vbindiff
    

1
ভাল ... আমি / চিন্তা করেছি / আমি কেবল ফাইলগুলি পৃথক করে কিনা তা জানতে চেয়েছিলাম; তবে সঠিক পার্থক্যগুলি সহজেই দেখতে সক্ষম হওয়া অনেক বেশি দরকারী। আমি ফাইলটির শেষে এলে সেগফল্টের দিকে ঝুঁকছিল, তবে কিছু মনে করবেন না, এটি এখনও কাজ করে।
জেরেমি

2
এটি কয়েকবার বলা হয়েছে, তবে এটি দুর্দান্ত একটি ছোট প্রোগ্রাম! (
এফআইআইও হোমব্রিউতে রয়েছে

2
এটি স্বীকৃত উত্তর হওয়া উচিত কারণ এটি ক্যানোনিকাল ডিফ কমান্ডের তীব্র ও অসহায় আউটপুটের চেয়ে অনেক উন্নততর পদ্ধতি।
গিয়েরয়েড মারফি

1
এটি বাইনারি ডিফের জন্য সেরা সরঞ্জাম।
কারলা ক্যামারগো

17

চেকসাম তৈরি করতে sha1 ব্যবহার করুন:

sha1 [FILENAME1]
sha1 [FILENAME2]

3
আপনার যদি কেবলমাত্র ফাইলগুলির একটির জন্য একটি চেকসাম থাকে তবে এটি কার্যকর হবে তবে আপনার যদি উভয় ফাইলই ডিস্কে থাকে তবে এটি অপ্রয়োজনীয়। diffএবং cmpউভয়ই আপনাকে বলবে যে তারা যদি কোনও অতিরিক্ত প্রচেষ্টা ছাড়াই পৃথক হয়।
জনসিপ

1
এর sha1sumবদলে কি হয় না sha1?
kol

2
নেটবিএসডি-তে শ 1, লিনাক্সে শ 1 সুম
স্কট প্রেসনেল

2
দুটি ফাইলের যে বিভিন্ন থাকা সত্ত্বেও একই ফলাফল ফিরে আসবে আছে: shattered.io
MIK

2
এসএএএ 1 এর মধ্যে ইতিমধ্যে একটি জনসাধারণের সংঘর্ষ ( ছিন্নভিন্ন.আইও ) রয়েছে এবং সম্ভবত কিছু অ-জনসাধারণও। সংঘর্ষের ফাইলগুলি অসংখ্য উত্পন্ন করতে একটি সংঘটন ব্যবহার করা যেতে পারে পরিবর্তে হ্যাশিংয়ের জন্য 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"'আপনি যদি ডিফার করতে চান এবং কোন বাইটগুলি sertedোকানো বা অপসারণ করা হয়েছিল তা দেখতে সঠিকভাবে ব্যবহার করুন ।
উইলিয়াম এন্টারিকেন 21 '13

বাইনারি ফাইলগুলি যখন হেক্সে প্রথমে রূপান্তরিত হয় না তখন মেল্টও কাজ করে। এটি চর সেটে নয় এমন জিনিসগুলির জন্য হেক্স মানগুলি দেখায়, অন্যথায় সাধারণ অক্ষর, যা বাইনারি ফাইলগুলির সাথে দরকারী যা কিছু আসকি পাঠ্যও ধারণ করে। অনেকগুলি অন্তত একটি যাদু স্ট্রিং দিয়ে শুরু করে।
ফেলিক্স ডমব্যাক

7

আপনি দুটি ফাইল একই কিনা তা পরীক্ষা করতে আপনি MD5 হ্যাশ ফাংশন ব্যবহার করতে পারেন, এটির সাহায্যে আপনি নিম্ন স্তরের পার্থক্যগুলি দেখতে পারবেন না, তবে দুটি ফাইলের তুলনা করার দ্রুত উপায়।

md5 <filename1>
md5 <filename2>

যদি উভয় এমডি 5 হ্যাশ (কমান্ড আউটপুট) একই হয় তবে দুটি ফাইল আলাদা নয়।


7
আপনি কি আপনার ডাউন ভোট ব্যাখ্যা করতে পারেন? SHA1 এর 4 টি upvotes রয়েছে, এবং ওপি যদি মনে করে যে দুটি ফাইল একই বা একই রকমের হওয়ার সম্ভাবনা রয়েছে, তবে সংঘর্ষের সম্ভাবনা সামান্য এবং এমডি 5 ভোটিংয়ের যোগ্য নয় তবে আপনি শুনেছেন যে আপনার হ্যাশ হওয়া উচিত MD5 এর পরিবর্তে SHA1 সহ পাসওয়ার্ডগুলি (এটি একটি ভিন্ন সমস্যা)।
রিক্কি

2
কারণ সম্পর্কে নিশ্চিত নয় তবে একটি খাঁটি সিএমপি ফাইলগুলির যে কোনও হ্যাশ ফাংশন গণনা করা এবং সেগুলির তুলনা করার চেয়ে কম দক্ষ হবে (কমপক্ষে কেবলমাত্র 2 ফাইলের জন্য)
পাউয়ে জিজকুর

1
যদি দুটি ফাইল বড় হয় এবং একই ডিস্কে (এসএসডি নয়), এমডি 5 বা শা * রূপটি আরও দ্রুত হতে পারে কারণ ডিস্কগুলি দুটি ফাইল ক্রমানুসারে পড়তে পারে যা প্রচুর মাথা গতি রক্ষা করে
ড্যানিয়েল

7
আমি অগ্রাহ্য করেছি কারণ আপনি আগের (খারাপ) সমাধানের একটি ছোটখাটো রূপটি পোস্ট করেছেন, যখন এটির কোনও মন্তব্য হওয়া উচিত ছিল।
জনসিপ

6

সিএমপি কমান্ড ব্যবহার করুন। পড়ুন বাইনারি ফাইল এবং পাঠ্য তুলনা অত্যাচার আরও তথ্যের জন্য।

cmp -b file1 file2

1
-b"বাইনারি মোডে" ফাইলগুলি তুলনা করে না। এটি আসলে "জিএনইউ দিয়ে cmp, আপনি সেই বাইটগুলির ASCII প্রতিনিধিত্ব দেখানোর জন্য -bবা --print-bytesবিকল্পটিও ব্যবহার করতে পারেন ।" আপনি যে ম্যানুয়ালটি দিয়েছেন তা ইউআরএল ব্যবহার করে ঠিক এটিই পেয়েছি।
ভিক্টর ইয়ারেমা

ভিক্টর ইয়ারেমা, "বাইনারি মোড" বলতে আপনার অর্থ কী তা আমি জানি না। 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: পাওয়া গেল না" (জিএনইউ লিনাক্স ব্যবহার করে)
পেয়েছি

@ ইউনসেন_াইডার কোন শেল, কোন লাইন? sh -xডিবাগিংয়ের জন্য স্ক্রিপ্টটি কল করুন
ড্যানিয়েল অ্যাল্ডার

এটি টার্মিনাল থেকে স্ক্রিপ্ট কল করার মাধ্যমে। লাইনটি 9.
unseen_rider

@ আনসেইন_রিডার আমি আপনাকে এইভাবে সাহায্য করতে পারি না। স্ক্রিপ্ট ঠিক আছে। পেস্টবিন.কম এ আপনার ডিবাগ আউটপুট পোস্ট করুন । আমার অর্থ কী তা আপনি এখানে দেখতে পারেন: পেস্টবিন . com / 8trgyF4A । এছাড়াও, দয়া করে আমাকে আউটপুটটি বলুনreadlink -f $(which sh)
ড্যানিয়েল অ্যাল্ডার

শেষ আদেশ দেয় /bin/dash। বর্তমানে পেস্টবিনে পেস্ট তৈরি হচ্ছে।
unseen_rider

4

ফাইলগুলি একেবারে আলাদা কিনা তা পরীক্ষা করার জন্য নিম্নলিখিত বিকল্পগুলির সাথে পৃথক একটি বাইনারি তুলনা করবে এবং ফাইলগুলি একই রকম হলে আউটপুটটিও ঘটবে:

diff -qs {file1} {file2}

যদি আপনি বিভিন্ন ডিরেক্টরিতে একই নামের সাথে দুটি ফাইলের তুলনা করে থাকেন তবে আপনি পরিবর্তে এই ফর্মটি ব্যবহার করতে পারেন:

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

ওএস এক্স এল ক্যাপিটান


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যা radare2বিচ্ছিন্ন করার একটি অংশ । উদাহরণস্বরূপ, এই আদেশ সহ:

radiff2 -x file1.bin file2.bin

আপনি পার্থক্য হাইলাইট করা হয়েছে যেখানে দুটি কলাম আউটপুট ফর্ম্যাট করা।


1

আমার পছন্দসইগুলি ভিএম প্যাকেজ থেকে এক্সএক্সডি হেক্স-ডাম্পার ব্যবহার করে:

1) ভিমডিফ ব্যবহার (ভিমের অংশ)

#!/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

যদি এমডি 5সাম একই হয় তবে বাইনারিগুলি সমান

যেমন

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 এ পরিবর্তন করতে হবে। যে কারও ল্যাপটপ আজকাল এমডি 5 এ সংঘর্ষ তৈরি করতে পারে এবং এই একক সংঘর্ষের উপসর্গের উপর ভিত্তি করে (একই আকারের 2 টি ফাইল, একই উপসর্গ এবং একই এমডি 5) সংখ্যক সংঘর্ষের ফাইলগুলি তৈরি করতে পারে (একই উপসর্গটি রয়েছে, বিভিন্ন ধরণের ব্লকিং রয়েছে, একই প্রত্যয় রয়েছে)
মিশাল আমব্রোজ

-1

দুটি বাইনারি ফাইল একই কিনা তা পরীক্ষা করার অপেক্ষাকৃত সহজ উপায় রয়েছে।

আপনি যদি কোনও প্রোগ্রামিং ভাষায় ফাইল ইনপুট / আউটপুট ব্যবহার করেন; উভয় বাইনারি ফাইলের প্রতিটি বিটকে তাদের নিজস্ব অ্যারেতে রাখতে পারেন।

এই সময়ে চেকটি হিসাবে সহজ:

if(file1 != file2){
    //do this
}else{
    /do that
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.