আমি কীভাবে নিরাপদে একটি .gz ফাইলকে .xz ফাইলে রূপান্তর করব


5

আমার কাছে কিছু বিশাল ফাইল রয়েছে যা বর্তমানে জিজেপ করা আছে এবং আমি সেগুলি xz করতে চাই। আমি এটি করার জন্য একটি স্ক্রিপ্ট সেট আপ করতে চাই, তবে আমি ডেটাটি হারাতে না চাই সে বিষয়ে সতর্কতা অবলম্বন করতে চাই, অর্থাত্ xz সংস্করণটি অবশ্যই সঠিকভাবে তৈরি না করা অবধি আমার কখনই জিজিপিড সংস্করণ মুছে ফেলা উচিত নয়। যেহেতু এগুলি বড় ফাইল, আমি প্রথমে ফাইলটি ডিস্কে আনজিপ না করাকেও পছন্দ করব। আমি ভাবছিলাম একটি পাইপ set -o pipefail; gzip -dc file.gz | xz > file.xz && rm file.gzআমি যা চাই তার কাছাকাছি হতে পারে। এটি করার সঠিক উপায় কী? এটি কি চূড়ান্ত ফাইলটি সরানোর আগে ঘটে যাওয়া কোনও ব্যর্থতা ধরার গ্যারান্টিযুক্ত?


আমার মনে হয় আপনি ব্যবহার করা উচিত &&না ||আপনার && rm file.gz। অন্যথায় এর সাথে ||, ব্যর্থ হয়ে file.gzগেলেও সরানো হবে xzযা আপনি চান না।
ড্যান ডি

@ ড্যান ডি অবশ্যই আপনি ঠিক, স্থির
পাইথোনিক রূপক

উত্তর:


9

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


যেখানে দেনা আছে সেখানে দেনা পরিশোধ করুন

স্ট্যাকওভারফ্লো-এর এই উত্তরটি আমাকে এই স্ক্রিপ্টটি লেখার ক্ষেত্রে যথেষ্ট সহায়তা করেছিল।


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

আমার এটি যুক্ত করা উচিত, ইসিসি র‌্যামের একটি সিস্টেমে এবং অন্তর্নির্মিত অখণ্ডতা যাচাই করে একটি ফাইল সিস্টেম চালনা করা, যেমন btrfsবা zfs, অপারেটিং সিস্টেম এবং হার্ডওয়্যার ইতিমধ্যে একসাথে কাজ করছে আমার শে 1 এসাম পরীক্ষার সাথে অনুরূপ কিছু করার জন্য, তাই আপনি যদি চালাচ্ছেন এই জাতীয় কনফিগারেশনে, এই স্ক্রিপ্ট থেকে sha1sum চেক অপসারণের ঝুঁকি বেশ নগণ্য। অন্যদিকে, আপনার যদি নন-ইসিসি র‌্যাম এবং একটি ফাইল সিস্টেম রয়েছে যা অন্তর্নির্মিত অখণ্ডতা নেই, এটি আপনার স্ক্রিপ্টটিকে উল্লেখযোগ্যভাবে নিরাপদ করে তুলবে ।
allquixotic
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.