অতিরিক্ত ডিস্কের জায়গা না ব্যবহার করে আমি কীভাবে লিনাক্সের জায়গায় কোনও ফাইল সংকুচিত করতে পারি?


20

আমি একটি 100 গিগাবাইট ড্রাইভ পেয়েছি যার একটি 95 গিগাবাইট ফাইল রয়েছে। আমার ড্রাইভে কিছু জায়গা খালি করা দরকার (এবং এখনই ফাইলটি ড্রাইভ থেকে স্থানান্তর করা কোনও বিকল্প নয়)। ফাইলের সাথে ভাল কম্প্রেস হবে gzipবা bz2বা যাই হোক না কেন, কিন্তু এই সব প্রোগ্রাম একটি পৃথক ফাইলে কম্প্রেস ফাইল লিখুন। এর জন্য আমার পর্যাপ্ত ফাঁকা জায়গা নেই।

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


আমার পুরানো জায়গায় আমরা ব্যবহার করার জন্য একটি শেষ বিকল্পটি ছিল কোথাও একটি দির থাকায় এতে আবর্জনায় ভরা 1 জি ফাইলের পুরো গোছা ছিল। তারপরে, আপনি যদি একটি চিমটি হয়ে যায় তবে কিছুটা জরুরি জায়গা দেওয়ার জন্য আপনি সেগুলির কিছু সরিয়ে ফেলতে পারেন।

উত্তর:


13

এটি কনসেপ্ট বাশ ওয়ান-লাইনারের প্রমাণ, তবে এটি আপনাকে শুরু করা উচিত। আপনার নিজের ঝুঁকিতে ব্যবহার করুন।

truncate -s `gzip -c file | dd of=file conv=notrunc 2>&1 | sed -n '$ s/ .*$// p'` file
mv file file.gz

এটি জিডিএস ডেটা ডিডি প্রসেসে পাইপ দিয়ে কাজ করে যা এটিকে একই ফাইলটিতে ফিরিয়ে দেয়। সমাপ্তির পরে, ফাইলটি জিজেড আউটপুট আকারে কেটে গেছে।

এটি ধরে নিয়েছে যে ডিডির আউটপুটটির শেষ লাইনটি মেলে:

4307 বাইট (4.3 কেবি) অনুলিপি করা হয়েছে, 2.5855e-05 s, 167 এমবি / এস

যেখানে প্রথম ক্ষেত্রটি বাইটের একটি পূর্ণসংখ্যা। এই ফাইলটি কাটতে হবে এমন আকার। আমি 100% নিশ্চিত নই যে আউটপুট ফর্ম্যাটটি সর্বদা একই থাকে।


নিফটি ট্রিক। কেন আপনি conv=notruncপ্রয়োজনীয় তা ব্যাখ্যা করতে পারেন ?
sleske

সম্ভবত এটি না। gzip -c file | dd of=fileঠিক পাশাপাশি কাজ করতে দেখা যায়।
user710307

1
লিঙ্কযুক্ত প্রশ্নের লোকেরা এটি চেষ্টা করেছিল (এবং আমি এটিও চেষ্টা করেছি); এটি সাধারণভাবে কাজ করে না। দেখে মনে হচ্ছে এটি কেবল খুব ছোট ফাইলের জন্যই কাজ করে - সম্ভবত কারণ gzip একটি ছোট ফাইলটিকে কমপ্রেস করার আগে র‌্যামে পড়বে। বড় ফাইলগুলির জন্য (কয়েকটি এমবি), এটি সংকোচনযোগ্য হলেও কার্যকর হয় না।
সলেস্কে

3
হাঁ। সুতরাং কনভ = notrunc প্রয়োজনীয়।
user710307

1
এটি কি সম্ভব নয় যে কোনও সময় সংক্ষেপণ প্রোগ্রাম (উদাহরণস্বরূপ gzip) মূল ডেটা বাইটের চেয়ে বেশি শিরোনাম এবং ডেটা বাইট লিখে, এভাবে ফাইলের কিছু অংশ ওভাররাইট করে? আমি অনুমান করি এটি নির্বাচিত কম্প্রেশন প্রোগ্রামের উপর নির্ভর করে। কীভাবে এই ঘটনাটি ঘটানো থেকে রোধ করা যায় বা কীভাবে (IM) সম্ভাবনা রয়েছে তা সম্পর্কে কারও ধারণা রয়েছে?
ড্যানিয়েল বোহ্মার

7

এটি এত বেশি নয় gzipএবং bzip2আসলটি ওভাররাইট করে। পরিবর্তে, তারা একটি নতুন ফাইল হিসাবে সংকুচিত ডেটা ডিস্কে লেখেন এবং যদি সেই অপারেশনটি সফল হয় তবে তারা আসল সংকোচিত ফাইলটিকে লিঙ্কমুক্ত করে।

আপনার যদি পর্যাপ্ত র‍্যাম থাকে, আপনি কোনও অস্থায়ীভাবে কোনও tmpfsফাইল সিস্টেমে ফাইলগুলি সংকুচিত করতে একটি স্ক্রিপ্ট লিখতে পারেন, তারপরে ডিস্কে আসলটি সরিয়ে ফেলুন এবং সংক্ষেপিত সংস্করণ দিয়ে এটি প্রতিস্থাপন করুন। এরকম কিছু হতে পারে:

# some distributions mount /dev/shm as tmpfs; replace with bzip2 if you prefer
if gzip -q9c /full/disk/somefile > /dev/shm/somefile.gz
then
    rm -f /full/disk/somefile && mv -i /dev/shm/somefile.gz /full/disk
fi

tmpfsমূলত একটি র‌্যাম ডিস্ক হওয়ায় কেবল আপনার স্মৃতি ব্যবহার সম্পর্কে সচেতন হন । একটি বৃহত আউটপুট ফাইল সহজেই সিস্টেমের অনাহারে থাকতে পারে এবং আপনার জন্য অন্যান্য সমস্যার কারণ হতে পারে।


1
এটি কাজ করার জন্য যথেষ্ট পাগল
অ্যান্ড্রু ল্যামবার্ট

আমি খামটি ধাক্কা দিতে পছন্দ করি
জেমস স্নেরিঞ্জার

3

কোনও উপায় নেই যা এইভাবে কাজ করে, কারণ আপনি যে কারণে দেন। খুব কম লোকই এমন একটি সরঞ্জাম লিখতে ইচ্ছুক যা ইচ্ছাকৃতভাবে ঝুঁকিপূর্ণ আচরণ প্রয়োগ করে।


আমি আশা করছিলাম যে এটি কোনও ইউটিলিটির জন্য অনিরাপদ, অ-ডিফল্ট বিকল্প হবে। আপনি কি বিকল্পের কথা ভাবতে পারেন? স্থানটিতে কোনও ফাইল কেটে দেওয়ার কোনও উপায় আছে, যেমন প্রথম 2 জিবি সরান? এটি আমাকে একবারে এক অংশকে সংকুচিত করতে আমার সীমাবদ্ধ মুক্ত স্থানটি ব্যবহার করতে দেবে, উত্স ফাইলটি আমি যেতে যেতে সঙ্কুচিত করলাম।
লি

কোনও সরঞ্জাম দিয়ে কোনও ফাইল সিস্টেমের কোনও ফাইলের শুরু থেকে ডেটা অপসারণ করার সত্যিই কোনও বুদ্ধিমান উপায় নেই।
Ignacio Vazquez-Abram

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

1

বিভাজন এবং সিএসপ্লিট কমান্ডগুলি বড় ফাইলটিকে ছোট অংশগুলিতে বিভক্ত করতে এবং তারপরে স্বতন্ত্রভাবে সংকোচনের জন্য ব্যবহৃত হতে পারে। পুনরায় সমাবেশ করা বরং সময় সাশ্রয়ী হবে।


আরেকটি ভাল বিকল্প। এটি করার জন্য কেউ সম্ভবত কিছু স্ক্রিপ্ট লিখতে পারে। যাইহোক, এটি অনেকগুলি পৃথকভাবে সংকুচিত ফাইলগুলি দেয়, যা সঙ্কুচিত করার পরে পুনরায় কনটেনেট করা দরকার, যা এত সুন্দর নয়।
সলেসকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.