মূলত, আপনার যা দরকার তা হ'ল ফাইলটি টারে পাইপ করা এবং আপনার সামনে যাওয়ার সাথে সামনে "লুপ" করা।
স্ট্যাকওভারফ্লোতে, কেউ একজন জিজ্ঞাসা করেছিল কীভাবে সামনে একটি ফাইল কেটে ফেলা যায় তবে মনে হয় এটি সম্ভব নয়। আপনি এখনও একটি বিশেষ উপায়ে জিরো দিয়ে ফাইলের সূচনা পূরণ করতে পারেন যাতে ফাইলটি একটি স্পার্স ফাইল হয়ে যায় , তবে কীভাবে এটি করতে হয় তা আমি জানি না। যদিও আমরা ফাইলটির শেষে ছাঁটাই করতে পারি। তবে টারের পিছনে নয়, সংরক্ষণাগারটি সামনের দিকে পড়া দরকার needs
সমাধান ঘ
ইন্ডিয়ারেশনের একটি স্তর প্রতিটি সমস্যা সমাধান করে। প্রথমে জায়গায় জায়গায় ফাইলটি বিপরীত করুন, তারপরে এটি পিছনের দিকে পড়ুন (যার ফলে আসল ফাইলটি ফরোয়ার্ডগুলি পড়ার ফলস্বরূপ) এবং আপনি যাওয়ার সাথে সাথে বিপরীত ফাইলের শেষটি কেটে ফেলুন।
শুরু এবং ফাইলের শেষে বিনিময় করার জন্য আপনাকে একটি প্রোগ্রাম (সি, অজগর, যাই হোক না কেন) লিখতে হবে, খণ্ড খণ্ড খণ্ড করে, এবং তারপরে এই খণ্ডগুলিকে একবারে টুকরো টুকরো করে কাটাতে হবে। এটি সমাধান 2 এর ভিত্তি যা সম্ভবত কার্যকর করা সহজ।
সমাধান 2
আরেকটি পদ্ধতি হ'ল ফাইলটিকে জায়গায় ছোট ছোট অংশগুলিতে বিভক্ত করা , তারপরে সেই খণ্ডগুলি মুছে ফেলা হবে। নীচের কোডটিতে এক মেগাবাইটের একটি অংশের আকার রয়েছে, আপনার প্রয়োজনের উপর নির্ভর করে সামঞ্জস্য করুন। বড়টি দ্রুত হয় তবে বিভাজন এবং নিষ্কাশনের সময় আরও মধ্যবর্তী স্থান নেবে।
ফাইল সংরক্ষণাগার.আরটি বিভক্ত করুন:
archive="archive.tar"
chunkprefix="chunk_"
# 1-Mb chunks :
chunksize=1048576
totalsize=$(wc -c "$archive" | cut -d ' ' -f 1)
currentchunk=$(((totalsize-1)/chunksize))
while [ $currentchunk -ge 0 ]; do
# Print current chunk number, so we know it is still running.
echo -n "$currentchunk "
offset=$((currentchunk*chunksize))
# Copy end of $archive to new file
tail -c +$((offset+1)) "$archive" > "$chunkprefix$currentchunk"
# Chop end of $archive
truncate -s $offset "$archive"
currentchunk=$((currentchunk-1))
done
এই ফাইলগুলিকে টারে পাইপ করুন (নোট করুন আমাদের দ্বিতীয় টার্মিনালে চঙ্কপ্রিফিক্স ভেরিয়েবলের প্রয়োজন):
mkfifo fifo
# In one terminal :
(while true; do cat fifo; done) | tar -xf -
# In another terminal :
chunkprefix="chunk_"
currentchunk=0
while [ -e "$chunkprefix$currentchunk" ]; do
cat "$chunkprefix$currentchunk" && rm -f "$chunkprefix$currentchunk"
currentchunk=$((currentchunk+1))
done > fifo
# When second terminal has finished :
# flush caches to disk :
sync
# wait 5 minutes so we're sure tar has consumed everything from the fifo.
sleep 300
rm fifo
# And kill (ctrl-C) the tar command in the other terminal.
যেহেতু আমরা একটি নামযুক্ত পাইপ ব্যবহার করি ( mkfifo fifo
), আপনাকে একবারে সমস্ত খণ্ড পাইপ করতে হবে না। আপনি যদি জায়গাতে সত্যিই টান থাকেন তবে এটি কার্যকর হতে পারে। আপনি নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করতে পারেন:
- সরান, বলুন শেষ 10 গিগাবাইট অন্য ডিস্কে চলে আসে,
- আপনার কাছে থাকা খণ্ডগুলি দিয়ে নিষ্কাশন শুরু করুন,
while [ -e … ]; do cat "$chunk…; done
লুপটি শেষ হয়ে গেলে (দ্বিতীয় টার্মিনাল):
tar
কমান্ডটি থামিয়ে দিবেন না, ফিফো (প্রথম টার্মিনাল) সরিয়ে ফেলবেন না , তবে আপনি চালাতে পারবেন, সেক্ষেত্রেsync
,
- কিছু এক্সট্রাক্ট করা ফাইল যা আপনি জানেন যে সম্পূর্ণ হয়েছে (এই ফাইলগুলি বের করে ফেলার জন্য ডেটার জন্য অপেক্ষা করা থামছে না) অন্য ডিস্কে নিয়ে যান,
- অবশিষ্ট অংশগুলি আবার সরিয়ে দিন,
while [ -e … ]; do cat "$chunk…; done
আবার লাইনগুলি চালিয়ে এক্সট্রাকশন পুনরায় শুরু করুন।
অবশ্যই এটি হেট ভোল্টেজ , আপনি প্রথমে একটি ডামি সংরক্ষণাগারটিতে সবকিছু ঠিক আছে কিনা তা পরীক্ষা করতে চান, কারণ আপনি যদি ভুল করেন তবে ডেটা বিদায় জানাবেন ।
আপনি কখনই জানতে পারবেন না যে প্রথম টার্মিনালটি ( tar
আসলে) ফিফোর বিষয়বস্তুগুলি প্রক্রিয়াজাতকরণ শেষ করেছে, সুতরাং আপনি যদি এটি পছন্দ করেন তবে পরিবর্তে আপনি এটি চালাতে পারেন, তবে আপনার অন্য কোনও ডিস্কের সাথে নির্বিঘ্নে অংশগুলি বিনিময় করার সম্ভাবনা থাকবে না:
chunkprefix="chunk_"
currentchunk=0
while [ -e "$chunkprefix$currentchunk" ]; do
cat "$chunkprefix$currentchunk" && rm -f "$chunkprefix$currentchunk"
currentchunk=$((currentchunk+1))
done | tar -xf -
দাবি পরিত্যাগী
মনে রাখবেন যে এই সমস্ত কাজ করার জন্য আপনার শেল, লেজ এবং কাটা কাটা অবশ্যই -৪-বিট পূর্ণসংখ্যা সঠিকভাবে পরিচালনা করতে হবে (এর জন্য আপনার কোনও 64-বিট কম্পিউটার বা অপারেটিং সিস্টেমের দরকার নেই)। মাইনটি করে, তবে আপনি যদি এই প্রয়োজনীয়তাগুলি ছাড়াই কোনও সিস্টেমে উপরের স্ক্রিপ্টটি চালান, আপনি সংরক্ষণাগারটি.আরটিতে সমস্ত ডেটা আলগা করবেন ।
এবং এটি যে কোনও ক্ষেত্রে ভুল হয়ে যায়, আপনি যেকোন উপায়ে সংরক্ষণাগার.তার মধ্যে সমস্ত ডেটা আলগা করে দেবেন, সুতরাং আপনার ডেটা ব্যাকআপ রয়েছে তা নিশ্চিত করুন।