আমি কীভাবে অনেকগুলি সংক্ষেপিত ফাইলকে একটি সংরক্ষণাগারে একত্রিত করব?


10

আমার কাছে কয়েক শতাধিক .tar.xzফাইল রয়েছে যা প্রায় অভিন্ন (সেগুলি দৈনিক ডাটাবেস ডাম্প এবং ডাটাবেস ধীরে ধীরে পরিবর্তিত হয়)।

আমি বিশ্বাস করি যে সঙ্কুচিত ফাইলগুলির মধ্যে সাদৃশ্যগুলির কারণে তারা খুব ভালভাবে সংকোচিত হবে এবং ছোট স্কেল টেস্টে দেখা গেছে যে এই সংকোচিত ফাইলগুলির যে কোনও সংখ্যাকে সংকুচিত করা তাদের একটির চেয়ে সামান্য বড় একটি সংরক্ষণাগার তৈরি করে।

আমার সমস্যাটি হ'ল সমস্ত সঙ্কুচিত ফাইলগুলি কয়েকটি টেরাবাইট হবে (সংক্ষেপণের অনুপাতটি প্রায় 25: 1) এবং আমার কাছে ওয়ার্কিং এরিয়া হিসাবে ব্যবহার করার মতো ডিস্কের বেশি জায়গা নেই।

একক আর্কাইভে এগুলি যুক্ত করে এবং সেগুলি সংমিশ্রণের সুবিধাগুলি একসাথে রেখে পৃথক সংকোচিত ফাইলগুলিকে একবারে প্রক্রিয়া করার কোনও উপায় আছে কি?


আপনি কি এটি স্ক্রিপ্ট করার চেষ্টা করেছেন, যাতে আপনি একটি ফাইল সঙ্কুচিত করেন, প্রদত্ত সংরক্ষণাগারে সমস্ত ফাইল যুক্ত করেন এবং তারপরে পরবর্তীটিতে যান?
darnir

উত্তর:


10

যেহেতু টার ফাইলগুলি স্ট্রিমিং ফর্ম্যাট - আপনি সেগুলির catদুটি এক সাথে করতে পারেন এবং প্রায় সঠিক ফলাফল পেতে পারেন - এটি করার জন্য আপনার এগুলিকে ডিস্কে বের করার দরকার নেই। আপনি ফাইলগুলি কেবল সংক্ষেপিত করতে (কেবল), তাদের একত্রে সংমিশ্রণ করতে এবং সেই স্ট্রিমটি পুনরায় সংক্ষেপণ করতে পারেন:

xzcat *.tar.xz | xz -c > combined.tar.xz

combined.tar.xzকম্পোনেন্ট টার্বলগুলির সমস্ত ফাইলের সংকুচিত টার্বল হবে যা কেবল সামান্য দূষিত। নিষ্কাশন করতে, আপনাকে --ignore-zerosবিকল্পটি (জিএনইউতে tar) ব্যবহার করতে হবে , কারণ সংরক্ষণাগারগুলিতে একটি "ফাইলের শেষ" চিহ্ন রয়েছে যা ফলাফলের মাঝামাঝি সময়ে উপস্থিত হবে। এটি বাদে, যদিও সবকিছু সঠিকভাবে কাজ করবে।

জিএনইউ সম্মিলিত আর্কাইভ উত্পাদন করার জন্য tarএকটি --concatenateমোড সমর্থন করে । উপরের মতো একই সীমাবদ্ধতা রয়েছে - আপনাকে --ignore-zerosনিষ্কাশন করতে অবশ্যই ব্যবহার করতে হবে - তবে এটি সংকোচিত সংরক্ষণাগারগুলির সাথে কাজ করে না। প্রক্রিয়া প্রতিস্থাপন ব্যবহার করে এটিকে কাজে লাগাতে আপনি কিছু তৈরি করতে পারেন তবে এটি একটি ঝামেলা এবং আরও ভঙ্গুর।

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


কেবলমাত্র একটি নির্দিষ্ট tarবাস্তবায়ন নিয়ে কাজ করা সংরক্ষণাগারগুলি যদি আপনার উদ্দেশ্যগুলির জন্য পর্যাপ্ত না হয় তবে সংরক্ষণাগারটিতে আটকানো rআপনার বন্ধু হ'ল:

tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
    mkdir tmp
    pushd tmp
    tar xJf "../$x"
    tar rJf ../combined.tar.xz .
    popd
    rm -r tmp
done

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

নোট করুন - আপনি ঠিক কী চান তার উপর নির্ভর করে - কেবলমাত্র সংরক্ষণাগারটিতে সংকোচিত টার ফাইলগুলি যুক্ত করা পর্যাপ্ত হতে পারে। তারা একক ফাইলে তাদের লিখিত সামগ্রীর পাশাপাশি প্রায় (প্রায়) সংকোচিত করবে এবং এটি প্রতিটি ফাইলের সংক্ষেপণ ওভারহেডকে হ্রাস করবে। এটি দেখতে এমন কিছু দেখাচ্ছে:

tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
    xz -dk "$x"
    tar rJf combined.tar.xz "${x%.xz}"
    rm -f "${x%.xz}"
done

চূড়ান্ত সংকুচিত আকারের ক্ষেত্রে এটি সামান্য কম দক্ষ কারণ প্রবাহে অতিরিক্ত টার শিরোনাম রয়েছে তবে সমস্ত ফাইলগুলিকে ফাইল হিসাবে আহরণ এবং পুনরায় যুক্ত করতে কিছুটা সময় সাশ্রয় করে। আপনি combined.tar.xzঅনেকগুলি (সঙ্কুচিত) db-*.tarফাইল সমেত শেষ করবেন ।


ধন্যবাদ, আপনার দ্বিতীয় বিকল্পটি আমার উদ্দেশ্যটির জন্য সঠিক দেখাচ্ছে, তবে আপনি কি আপনার শেষ অনুচ্ছেদে বিস্তারিত বর্ণনা করতে পারেন? এটি দেখতে কেমন হবে?
jl6

@ jl6: সম্পাদনা দেখুন See
মাইকেল হোমার

দুঃখিত, কেবলমাত্র এটি পরীক্ষা করতে সক্ষম হয়েছি। আপনার দ্বিতীয় পদ্ধতিটি আমাকে এই ত্রুটি দেয়:tar: Cannot update compressed archives
jl6
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.