জায়গায় নিষ্কাশন টার আর্কাইভ


14

আমার এখানে একটু দ্বিধা আছে ...

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

যাইহোক, রিজার্ভিং সার্ভারের তারার সংরক্ষণাগারটি পাওয়ার পরে কেবল 5 গিগাবাইট জায়গা বাকি রয়েছে।

আমি কোনও জায়গায় 'টার-ইন-প্লেস' বের করতে পারি? সংরক্ষণাগারটি উত্তোলনের পরে আমার রাখার দরকার নেই, তাই আমি ভাবছিলাম যে এটি করা সম্ভব কিনা।

সম্পাদনা: এটি লক্ষ্য করা উচিত যে সংরক্ষণাগারটি ইতিমধ্যে প্রেরণ করা হয়েছে, এবং আমি অন্য কোনও পদ্ধতির মাধ্যমে পুনরায় বিক্রয় এড়াতে চাই।

উত্তর:


11
% tar czf - stuff_to_backup | ssh backupmachine tar xvzf -

এটি অনুবাদ করে:

  • স্টারআউট থেকে 'স্টাফ_ট_ব্যাকআপ' ট্যার এবং সংকোচিত করুন
  • ssh এর মাধ্যমে 'ব্যাকআপম্যাচিন' এ লগইন করুন
  • 'ব্যাকআপম্যাচিন'-এ' টার 'চালান এবং স্টিডিন থেকে আসা স্টাফটি টিপুন

জিনিসটি স্থানান্তর করতে আমি ব্যক্তিগতভাবে 'rsync ওভার ssh' ব্যবহার করব কারণ সংযোগটি ভেঙে গেলে আপনি স্টাফ ট্রান্সফারিং চালিয়ে যেতে পারেন:

% rsync -ar --progress -e 'ssh' 'stuff_to_backup' user@backupmachine:/backup/

যা 'স্টাফ_ট_ব্যাকআপ' থেকে 'ব্যাকআপম্যাচাইন' এর 'ব্যাকআপ' ফোল্ডারে সবকিছু স্থানান্তর করবে। যদি সংযোগ বিচ্ছিন্ন হয়, কেবল কমান্ডটি পুনরাবৃত্তি করুন। 'স্টাফ_ট_ব্যাকআপ' -র কিছু ফাইল যদি পরিবর্তন হয় তবে স্টাফটি পুনরাবৃত্তি করুন, কেবলমাত্র পার্থক্য স্থানান্তরিত হবে।


আমার সম্পাদিত প্রশ্নটি দেখুন
বেনামে কাপুরুষ

@ চার্লি সোমারভিল: হ্যাঁ, আপনি গুরুত্বপূর্ণ অংশটি প্রথম স্থানে রেখে গেছেন। :)
আকির

6

অন্য মেশিনটি যদি শ্যাশ করে থাকে তবে আমি আপনাকে আরএসআইএনসি হিসাবে অন্য একটি বিকল্প হিসাবে ব্যবহার করতে চাইছি যা টার ফাইল ব্যবহার করবে না:

rsync -avPz /some/dir/ user@machine:/some/other/dir/

এবং নেতাদের সাথে সাবধানতা অবলম্বন করুন /

আপডেট সম্পাদনা করুন

ঠিক আছে, আমি দেখতে পাচ্ছি যে আপনি এটি মুছে ফেলতে এবং আরএসসিএনসি'র সাথে পুনরায় কাজ করতে সক্ষম না হলে এটি এখন কীভাবে দুর্দান্ত আচার। আমি সম্ভবত একটি নির্বাচনী এক্সট্র্যাক্ট চেষ্টা করে টার থেকে মুছে ফেলব।

নির্বাচনী এক্সট্র্যাক্ট:

$ tar xvf googlecl-0.9.7.tar googlecl-0.9.7/README.txt
googlecl-0.9.7/README.txt

নির্বাচনী মোছা:

$ tar --delete --file=googlecl-0.9.7.tar googlecl-0.9.7/README.txt

তবে মনে হচ্ছে আপনি এর জন্য একটি স্ক্রিপ্ট কোড করার জন্য প্রচুর সময় ব্যয় করবেন ...


আমার সম্পাদিত প্রশ্নটি দেখুন
বেনামে কাপুরুষ

আমার সম্পাদিত উত্তর দেখুন ... শুভকামনা: - /
ইউপ্পি নেটওয়ার্কিং

সম্পাদনার জন্য ধন্যবাদ। ফাইলগুলি আসলে সংখ্যার সাথে নামযুক্ত, সুতরাং ব্যাশে লুপের জন্য দ্রুত একটি কৌশলটি করতে পারে quick
বেনামে কাপুরুষ

1
@ চর্লি সোমারভিল: আপনারা টারের শেষে সঞ্চিত ফাইলগুলি দিয়ে শুরু করতে হবে, অন্যথায় আপনি টার একটি নতুন সংরক্ষণাগার তৈরি করে শেষ করতে পারেন ... সুতরাং, প্রথমে টারের শেষ থেকে ফাইলগুলি মুছুন।
আকির

5

মূলত, আপনার যা দরকার তা হ'ল ফাইলটি টারে পাইপ করা এবং আপনার সামনে যাওয়ার সাথে সামনে "লুপ" করা।

স্ট্যাকওভারফ্লোতে, কেউ একজন জিজ্ঞাসা করেছিল কীভাবে সামনে একটি ফাইল কেটে ফেলা যায় তবে মনে হয় এটি সম্ভব নয়। আপনি এখনও একটি বিশেষ উপায়ে জিরো দিয়ে ফাইলের সূচনা পূরণ করতে পারেন যাতে ফাইলটি একটি স্পার্স ফাইল হয়ে যায় , তবে কীভাবে এটি করতে হয় তা আমি জানি না। যদিও আমরা ফাইলটির শেষে ছাঁটাই করতে পারি। তবে টারের পিছনে নয়, সংরক্ষণাগারটি সামনের দিকে পড়া দরকার 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-বিট কম্পিউটার বা অপারেটিং সিস্টেমের দরকার নেই)। মাইনটি করে, তবে আপনি যদি এই প্রয়োজনীয়তাগুলি ছাড়াই কোনও সিস্টেমে উপরের স্ক্রিপ্টটি চালান, আপনি সংরক্ষণাগারটি.আরটিতে সমস্ত ডেটা আলগা করবেন

এবং এটি যে কোনও ক্ষেত্রে ভুল হয়ে যায়, আপনি যেকোন উপায়ে সংরক্ষণাগার.তার মধ্যে সমস্ত ডেটা আলগা করে দেবেন, সুতরাং আপনার ডেটা ব্যাকআপ রয়েছে তা নিশ্চিত করুন।


0

আপনার যদি অবজেক্ট ফাইলগুলি জুড়ে সরানোর জন্য থাকে তবে সেগুলি সরিয়ে দেওয়ার চেষ্টা করুন। এটি স্থানের যথেষ্ট পরিমাণে সাশ্রয় করবে।

$ strip `find . -name "*.bin"`
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.