SHA1 যোগ যোগ করা (যা গাণিতিকভাবে একটি হাস্যকরভাবে উচ্চ মাত্রার গ্যারান্টি দেয় যে ফাইলগুলি হ্যাশগুলি ম্যাচ করার সময় মেলে এবং হ্যাশগুলি মেলে না তখন ফাইলগুলি মেলে না) যেখানে মামলাগুলির বিরুদ্ধে রক্ষা করার জন্য ডেটা অখণ্ডতার একটি পরিমাপ যুক্ত করা হয় ডিস্ক সাবসিস্টেমটি লেখার সময় (নিঃশব্দ) ভুল করেছে। নিঃশব্দ দুর্নীতি বিরল তবে তা প্রতারণামূলক when
অবশ্যই, আপনি পড়ার সময় এলোমেলো ত্রুটি থাকলে আপনার এখনও বিভ্রান্ত ফলাফল হতে পারে, তবে সেক্ষেত্রে এই পরিমাণগুলি কোনওভাবেই মেলে না, অত্যন্ত উচ্চ মাত্রার নিশ্চিততার সাথে। অন্য কথায়, যদি সিস্টেমটি দূষিত হয় (র্যাম বা ডিস্কে ভুল বিট / ফ্ল্লিপ বিট / দূষিত ডেটা তৈরি করা হয়), তবে এটি ব্যর্থ হবে যেখানে কোনও সাধারণ &&
সাফল্য পেতে পারে এবং rm
দূষিত তথ্য সহ এই লাইনে যাওয়ার সম্ভাবনাটি অদৃশ্য হয়ে যায় ছোট (কারণ বেশিরভাগ ত্রুটিগুলি এলোমেলো উপায়ে দূষিত ডেটার দিকে ঝুঁকছে, রিডব্যাকের সময় SHA1 এ হ্যাশের সংঘর্ষের কারণ এলোমেলো পরিবর্তনের সম্ভাবনা দমকে দেওয়া ক্ষুদ্রতর))
#!/bin/bash
set -e
set -o pipefail
ORIGSUM=$(gzip -dc file.gz | tee >(xz > file.xz) | sha1sum)
NEWSUM=$(unxz -c file.xz | sha1sum)
if [ "${ORIGSUM}" = "${NEWSUM}" ]; then rm file.gz; fi
set -e
শুধু যত তাড়াতাড়ি শেল স্ক্রিপ্ট প্রস্থান তোলে কোনো স্ক্রিপ্ট লাইনটি একটি অশূন্য প্রস্থান কোড ফেরৎ।
তারপর আমরা ব্যবহার tee
কমান্ড ফাইলের আন-gzipped আউটপুট কপি করতে উভয়xz
সংকোচকারী, এবং থেকে sha1sum
প্রোগ্রাম। sha1sum
অস্থায়ীভাবে sha1sum প্রোগ্রামে অ-গিজিপ করে জিজেপ করা সংরক্ষণাগারটির মধ্যে থাকা মূল ডেটার SHA1 যোগফল গণনা করে, যা যোগফল গণনা করতে ডেটা পড়ে এবং তারপরে ডেটা বাতিল করে দেয়। ব্যবহার করে tee
, আমাদের কেবল একবার ফাইলটি ungziping এর সিপিইউ খরচ দিতে হবে।
তারপরে আমরা একটি অতিরিক্ত গণ্য-ব্যয়বহুল পদক্ষেপ (অতি-অতিরিক্ত-যাচাইয়ের জন্য) সঞ্চালন করি এবং আমাদের "নতুন ফাইল" SHA1 যোগফল পেতে ফাইলের (অস্থায়ীভাবে একটি স্ট্রিমে) xz সংক্ষেপণটি স্ট্রাইপ করে এবং এটি sha1sum এ পাইপ করি।
তারপরে আমরা দুটি অঙ্কের তুলনা করব, এবং যদি সেগুলি সমান স্ট্রিং না হয়, বা তাদের দুটি বা উভয়টি শূন্য দৈর্ঘ্যের হয় তবে আমরা হয় একটি স্ক্রিপ্ট ত্রুটি পেয়ে যাব (যা ধন্যবাদ, ধন্যবাদ set -e
), বা ফাইলটি হবে না সরানো হয়েছে। আপনি চাইলে else
ব্যবহারকারী-বান্ধব ত্রুটি হ্যান্ডলিংয়ের জন্য একটি ধারা প্রয়োগ করতে পারেন, তবে এই প্রয়োজনীয় স্ক্রিপ্টটি অত্যন্ত নিরাপদ হবে, যদিও কোনও ব্যবহারকারীর ইন্টারেক্টিভভাবে এই কমান্ডটি চালানো খুব তথ্যবহুল নয়।
শেষ পর্যন্ত, file.gz
শুধুমাত্র লিঙ্কমুক্ত হবে যদি এবং কেবল যদি এর ডিকম্প্রেস করা বিষয়বস্তু file.gz
এবং file.xz
সময় পয়েন্ট যে হ্যাশ, নির্ণিত ছিল নিশ্চিতভাবে একজন astronomically উচ্চ ডিগ্রী সঙ্গে (খারাপ কিছু মতভেদ ভুল যাচ্ছে কিছু হবে এ ঠিক অভিন্ন 1 এর 1 টি এর পরে 300 জিরো সহ)। এই মুহুর্তে আপনাকে কেবল এই স্ক্রিপ্টটি প্রস্থান করার পরে ডেটা দূষিত হওয়ার বিষয়ে চিন্তা করতে হবে । ;)
কর্মক্ষমতা
এই স্ক্রিপ্টটি প্রশ্নটিতে আপনার মূল স্ক্রিপ্টের প্রায় একই গতিতে চলবে, অংশটি যে চালায় সেগুলি ব্যতীতunxz
। ভাগ্যক্রমে, এলজেডএমএ থেকে সঙ্কোচন করা অত্যন্ত দ্রুত, প্রায় নিয়মিত জিপ হিসাবে দ্রুত এবং এলজেডএমএতে সংক্ষেপণের চেয়ে প্রস্থের ক্রমের মতো আরও দ্রুত । আপনার যদি দ্রুত সিপিইউ থাকে এবং ফাইলগুলি পর্যাপ্ত পরিমাণে ছোট হয় তবে স্ক্রিপ্টে এটি খুব বেশি রানটাইম যুক্ত করা উচিত নয় , তবে আপনি যদি পারফরম্যান্সের উপর ডেটা অখণ্ডতাটিকে মূল্য দেন তবে এটি একটি পরিষ্কার জয় win
যেখানে দেনা আছে সেখানে দেনা পরিশোধ করুন
স্ট্যাকওভারফ্লো-এর এই উত্তরটি আমাকে এই স্ক্রিপ্টটি লেখার ক্ষেত্রে যথেষ্ট সহায়তা করেছিল।
&&
না||
আপনার&& rm file.gz
। অন্যথায় এর সাথে||
, ব্যর্থ হয়েfile.gz
গেলেও সরানো হবেxz
যা আপনি চান না।