দুটি জিপিড ফাইল সমান কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


11

আমি একটি "বোবা" ব্যাকআপ করার সময় কোনও পাঠ্য ফাইলে ডেটা ডাম্প করে স্থান বাঁচানোর চেষ্টা করছি। আমার ব্যাকআপ স্ক্রিপ্টটি প্রতিদিন সম্পাদিত হয় এবং এর মতো দেখায়:

  1. ব্যাকআপ তারিখের নাম অনুসারে একটি ডিরেক্টরি তৈরি করুন।
  2. একটি পাঠ্য ফাইলে কিছু ডেটা ফেলে দিন "$name"
  3. যদি ফাইলটি বৈধ, এটা gzip: gzip "$name"। অন্যথায় rm "$name",।

আগের দিন যদি একই ডেটাও উপলভ্য ছিল (এবং সিমলিংক বা হার্ডলিঙ্ক তৈরি করা) তবে কোনও ফাইল সরানোর জন্য আমি একটি অতিরিক্ত পদক্ষেপ যুক্ত করতে চাই।

প্রথমে আমি ব্যবহারের কথা ভেবেছিলাম md5sum "$name", তবে এটি কাজ করে না কারণ আমি ফাইলের নাম এবং তৈরির তারিখও সঞ্চয় করি।

না gzipদুই gzipped ফাইল তুলনা এবং আমাকে বলুন কিনা তারা সমান বা না করার জন্য একটি বিকল্প আছে? যদি gzipএই জাতীয় বিকল্প না থাকে তবে আমার লক্ষ্য অর্জনের জন্য কি অন্য কোনও উপায় আছে?


1
এটি ব্যবহার করে দেখুন: linux.die.net/man/1/zdiff
mreithub

2
আমি প্রস্তাব দিতে diff <(zcat file1) <(zcat file2)যাচ্ছিলাম, তবে ম্রেথুবের পরামর্শটি zdiffআরও ভাল দেখাচ্ছে।
কেভিন

আপনি ম্যানুয়ালি অর্জনের জন্য যা চেষ্টা করছেন তা ব্যাক আপ্পসি আপনার জন্য করে
ড্রোন.আহ

@ drohne.ah ব্যাক আপ্পেক এক ধরণের ওভারকিল হতে পারে যদি এটি প্রতিদিন কেবল একটি ফাইল হয় ... (আমার ধারণা এটি একটি এসকিউএল ডাম্পের মতো যেখানে এটি
গিজিপ

1
@ এমডিপিসি এমডি 5-এ অ্যালগরিদম সমস্যাগুলি সম্ভবত প্রাসঙ্গিক নয়। সংঘর্ষ তৈরি করা সম্ভব, তবে সম্ভবত একমাত্র উদ্বেগ হ'ল ঘটনাক্রমে ঘটে, আক্রমণকারী দ্বারা নয়। আপনার কাছে ~ 2 ^ 64 ফাইল না হওয়া পর্যন্ত এখনও এটি হওয়ার সম্ভাবনা নেই। এমনকি প্রাক-আক্রমণ আক্রমণ সম্ভবত কিছু যায় আসে না।
ডার্বোবার্ট

উত্তর:


7

আপনি ব্যবহার করতে পারেন zcmpবা zdiff(অথবা কেভিন কম্যান্ড, যা অনুরূপ) mreithub তার মন্তব্যে প্রস্তাব দেওয়া হয়। এগুলো তুলনামূলকভাবে অদক্ষ হতে হবে যেমন তারা আসলে উভয় ফাইল ডিকম্প্রেস এবং তারপর তাদের বন্ধ পাস cmpবা diff। যদি আপনি কেবল "তারা কি একই" উত্তর দিতে চান তবে আপনি চান cmp, এটি আরও দ্রুত হবে।

এর সাথে আপনার অ্যাপ্রোচ md5sumপুরোপুরি ভাল তবে চলার আগে আপনার MD5 নেওয়া দরকার gzip। তারপরে ফলাফল .gzফাইলের পাশাপাশি এটি একটি ফাইলে সংরক্ষণ করুন। তারপরে আপনি সংকোচনের আগে সহজেই ফাইলটির তুলনা করতে পারেন। নামটি যদি একই হয় তবে এটি md5sum -cআপনার জন্য করবেন।

$ mkdir "backup1"
$ cd backup1
$ echo "test" > backup-file
$ md5sum backup-file > backup-file.md5
$ gzip -9 backup-file

এবং পরবর্তী ব্যাকআপ:

$ mkdir "backup2"
$ cd backup2
$ echo "test" > backup-file
$ md5sum -c ../backup1/backup-file.md5 
backup-file: OK

সুতরাং এটি পরিবর্তন হয়নি। ওটো, এটি কি পরিবর্তিত হয়েছিল:

$ echo "different" > backup-file
$ md5sum -c ../backup1/backup-file.md5 
backup-file: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

আপনি যদি --quietএটিতে পাস করেন তবে এটি আপনাকে প্রস্থান কোডটি দেবে। মেলে জন্য 0, পার্থক্যযুক্ত জন্য অ 0।

এমডি 5 মোটামুটি দ্রুত, তবে খুব স্পষ্টভাবে তা নয়। এমডি 4 ( openssl md4আপনি কমান্ড লাইনে সেরা অর্জন করেন, আমি বিশ্বাস করি) প্রায় দ্বিগুণ দ্রুত (এটি না এমডি 5 সুরক্ষিত নয়, তবে উভয়ই সংঘর্ষ প্রতিরোধী হিসাবে যখন কেউ তাদেরকে বিকৃত করার চেষ্টা না করে)। SHA-1 ( sha1sum) আরও সুরক্ষিত তবে ধীর; SHA-256 ( sha256sum) নিরাপদ তবে এখনও ধীর। সিআরসি 32 বেশ কয়েকগুণ দ্রুত হওয়া উচিত তবে এটি সংক্ষিপ্ত এবং এর ফলে আরও এলোমেলো সংঘর্ষ হবে। এটিও পুরোপুরি অনিরাপদ।


zdiffআমি কেবল একটি ফাইলের পরিবর্তন হয়েছে কিনা তা জানতে চাইলে এটি একটি অপব্যয় বলে মনে হচ্ছে , কী নয় । zcmpআকর্ষণীয় দেখাচ্ছে, আমি চেষ্টা করব।
লেকেনস্টেইন

7

@डरবার্টের উত্তরটি দুর্দান্ত, যদিও আমি খুঁজে পাওয়া কিছু অন্যান্য তথ্য ভাগ করতে চাই।

gzip -l -v

জিজিপ-সংকুচিত ফাইলগুলিতে ইতিমধ্যে একটি হ্যাশ রয়েছে (যদিও সুরক্ষিত নয়, এই এসও পোস্টটি দেখুন ):

$ echo something > foo
$ gzip foo
$ gzip -v -l foo.gz 
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 18b1f736 Feb  8 22:34                  34                  10 -20.0% foo

একটি দ্রুত ফিঙ্গারপ্রিন্ট পেতে সিআরসি এবং সঙ্কুচিত আকার একত্রিত করতে পারে:

gzip -v -l foo.gz | awk '{print $2, $7}'

CMP

দুটি বাইট সমান কিনা তা পরীক্ষা করার জন্য ব্যবহার করুন cmp file1 file2। এখন, একটি জিজেপড ফাইলে ডেটা এবং ফুটার (সিআরসি প্লাস মূল আকার) যুক্ত কিছু শিরোনাম রয়েছে। Gzip, বিন্যাসের বিবরণ শো যে হেডার যখন ফাইলটি কম্প্রেস করা হয় এবং ফাইলের নাম একটি nul-সমাপ্ত স্ট্রিংটি 10-বাইট হেডার পর যোগ হয় যে ধারণ করে।

সুতরাং, ধরে নিলাম যে ফাইলের নামটি ধ্রুবক এবং একই কমান্ড ( gzip "$name") ব্যবহার করা হয়েছে, cmpসময়টি সহ প্রথম বাইট ব্যবহার করে এবং এড়িয়ে গিয়ে দুটি ফাইল পৃথক কিনা তা পরীক্ষা করতে পারে :

cmp -i 8 file1 file2

দ্রষ্টব্য : অনুমান যে একই সংকোচন বিকল্পগুলি গুরুত্বপূর্ণ, অন্যথায় কমান্ড সর্বদা ফাইল হিসাবে পৃথক হিসাবে রিপোর্ট করবে। এটি ঘটে কারণ সংকোচন বিকল্পগুলি শিরোনামে সঞ্চিত থাকে এবং সংকোচিত ডেটাগুলিকে প্রভাবিত করতে পারে। cmpকেবল কাঁচা বাইট দেখেন এবং এটিকে gzip হিসাবে ব্যাখ্যা করবেন না।

আপনার যদি একই দৈর্ঘ্যের ফাইলের নাম থাকে তবে আপনি ফাইলের নামটি পড়ার পরে বাদ দিতে হবে বাইটগুলি গণনা করার চেষ্টা করতে পারেন। যখন ফাইলের নামগুলি বিভিন্ন আকারের হয়, আপনি cmpবাইটগুলি বাদ দেওয়ার পরে চালাতে পারেন cmp <(cut -b9- file1) <(cut -b10- file2)

zcmp

এটি অবশ্যই যাওয়ার সর্বোত্তম উপায়, এটি প্রথমে ডেটা সংকুচিত করে এবং বাইটের সাথে তুলনা শুরু করে cmp(সত্যই, এটি zcmp( zdiff) শেলসক্রিপ্টে করা হয়)।

একটি নোট, ম্যানুয়াল পৃষ্ঠাতে নিম্নলিখিত নোটটি থেকে ভয় পাবেন না:

তুলনা করার আগে যখন উভয় ফাইলকে সঙ্কুচিত করা আবশ্যক তখন দ্বিতীয়টি / tmp তে সংকুচিত হবে। অন্যান্য সমস্ত ক্ষেত্রে, zdiff এবং zcmp কেবল একটি পাইপ ব্যবহার করে।

যখন আপনার পর্যাপ্ত পরিমাণে নতুন বাশ থাকবে তখন সংক্ষেপণ একটি অস্থায়ী ফাইল ব্যবহার করবে না, কেবল একটি পাইপ। বা, zdiffসূত্রটি যেমন বলেছে:

# Reject Solaris 8's buggy /bin/bash 2.03.

যদি বাইট 4 (এফএলজি) 0 হয় তবে ফাইলের নামটি শিরোনামে নেই, সুতরাং আপনাকে এর দৈর্ঘ্য সম্পর্কে চিন্তা করার দরকার নেই। এছাড়াও, আমি gzip -v -lশিরোনামে চারটি এমটিটাইম বাইট শূন্য হলে এমটিটাইমের পরিবর্তে ফাইলের সময়টি রিপোর্ট করব। এছাড়াও লক্ষ করুন যে এমটিটাইম সেখানে উপস্থিত থাকলে এটি সাধারণত ফাইল সময়ের আগে কিছুটা আগে থাকে কারণ এটি যখন সংকোচন শুরু হয়েছিল।
কিচিন

0

দুটি জিজেপ ফাইলের তুলনা করতে, কেবল বিষয়বস্তু, একটি কমান্ড, না diff, কেবল তুলনা করাmd5sum

$ diff -q <(zcat one.gz|md5sum|cut -f1 -d' ') \
          <(zcat two.gz|md5sum|cut -f1 -d' ') \
    && echo same || echo not_same

আপনি প্রাসঙ্গিক পার্থক্যের জন্য "ফিল্টার" করতে পারেন,

$ diff -q <(zcat one.gz|grep -v '^-- Dump completed'|md5sum|cut -f1 -d' ') \
          <(zcat two.gz|grep -v '^-- Dump completed'|md5sum|cut -f1 -d' ') \
   && echo same || echo not_same

যদি স্ক্রিপ্টিং হয় তবে আমি একটি ফিল্টার ফাংশন সুপারিশ করব (পরীক্ষিত নয়, কেবল একটি উদাহরণ),

do_filter_sum() {
  zcat $1 | grep -v '^-- Dump completed' | md5sum | cut -f1 -d' '
}

diff -q <(do_filter_sum one.gz) \
        <(do_filter_sum two.gz) \
        && echo same || echo not_same

এমডি 5সাম একটি অপচয়, আপনি ব্যবহার করতে পারেন cmpzcatএবং এতে grepএকীভূত হতে পারে zgrep
লেকেনস্টেইন

সত্য, md5sum তুলনা করা প্রয়োজন নয় (যদি আপনি ইতিমধ্যে সেগুলি তৈরি না করে); ডার্বার্ট এটি ব্যবহার করার পরে আমি এটি ব্যবহার করেছি। zgrep হ'ল একটি স্ক্রিপ্ট যা মূলত বন্দুকদ্বিপ এবং গ্রেপ করে (বা সেড যেমনটি হতে পারে) তাই সেখানে কিছুটা পার্থক্য নেই। পোস্ট করা স্ক্রিপ্টটি ইচ্ছাকৃতভাবে প্লাগেবল অংশগুলির সাথে পাইপের শৃঙ্খলা হিসাবে দেখানো হয়েছে; সবকিছুকে একক কমান্ডে একীভূত করার কী মজা?
মাইকেল

1
এবং zcatঠিক আছে gunzip -c। সঠিক কাজের জন্য সঠিক সরঞ্জামটি ব্যবহার করুন, KISS ফোলা থেকে ভাল। এই ক্ষেত্রে আমি আমার সময়টি এমন কিছু লেখার জন্য ব্যয় করব যা প্রয়োজন অনুসারে কঠোর লিঙ্ক তৈরি করে, এটি আরও মজাদার।
লেকেনস্টেইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.