जगह में टार संग्रह


14

मुझे यहां थोड़ी दुविधा है ...

मुझे अपने सर्वर से दूसरे में लगभग 70 जीबी मूल्य की फाइलें स्थानांतरित करने की आवश्यकता थी, इसलिए मैंने फैसला किया कि उन्हें टारगेट करना और संग्रह भेजना सबसे तेज़ तरीका होगा।

हालाँकि, टेर आर्काइव प्राप्त करने के बाद प्राप्त सर्वर में केवल 5 GB स्थान बचा है।

क्या कोई रास्ता है जिससे मैं टार को 'इन-प्लेस' निकाल सकता हूँ? इसे निकालने के बाद मुझे संग्रह रखने की आवश्यकता नहीं है, इसलिए मैं सोच रहा था कि क्या ऐसा करना संभव है।

संपादित करें: यह ध्यान दिया जाना चाहिए कि संग्रह पहले ही भेजा जा चुका है, और मैं एक अलग विधि के माध्यम से फिर से बचना चाहूंगा।

जवाबों:


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

इसका अनुवाद इस प्रकार है:

  • टार और 'stuff_to_backup' को stdout में संपीड़ित करें
  • ssh के माध्यम से 'backupmachine' पर लॉगिन करें
  • 'बैकअप' पर 'टार' चलाएं और स्टड से आने वाले सामान को अनटार करें

मैं व्यक्तिगत रूप से सामान को स्थानांतरित करने के लिए 'ssync पर ss' का उपयोग करूंगा क्योंकि यदि कनेक्शन टूटता है तो आप सामान स्थानांतरित करना जारी रख सकते हैं:

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

जो 'stuff_to_backup' से 'backupmachine' पर 'बैकअप' फ़ोल्डर में सबकुछ स्थानांतरित कर देगा। यदि कनेक्शन टूट जाता है, तो बस कमांड दोहराएं। अगर 'stuff_to_backup' में कुछ फाइलें बदल जाती हैं, तो सामान को दोहराएं, केवल अंतर को स्थानांतरित किया जाएगा।


मेरा संपादित प्रश्न देखें
अनाम कायर

@ शर्ली सोमरविले: हां, आपने महत्वपूर्ण भाग को पहले स्थान पर छोड़ दिया। :)
अकीरा

6

यदि दूसरी मशीन में ssh है, तो मैं आपको rsync को एक अन्य विकल्प के रूप में सुझाऊंगा जो टार फाइल का उपयोग नहीं करता है:

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

और अग्रणी के साथ सावधान रहें /

अपडेट संपादित करें

ठीक है, मैं देख रहा हूँ कि यह अब कैसे एक बढ़िया अचार है यदि आप इसे हटाने में सक्षम नहीं हैं और rsync के साथ अनुशंसा करते हैं। मैं शायद एक चयनात्मक निकालने और टार से हटाने की कोशिश करूंगा।

चयनात्मक निकालने:

$ 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

हालांकि, ऐसा लगता है कि आप इसके लिए एक स्क्रिप्ट कोडिंग में बहुत समय बिताएंगे ...


मेरा संपादित प्रश्न देखें
अनाम कायर

मेरा संपादित उत्तर देखें ... सौभाग्य: - /
YuppieNetworking

संपादन के लिए धन्यवाद। फ़ाइलों को वास्तव में संख्याओं के साथ नाम दिया गया है, इसलिए बैश में लूप के लिए एक त्वरित बस चाल हो सकती है।
अनाम कायर

1
@ शर्ली सोमरविले: आपको टार के अंत में संग्रहीत फ़ाइलों के साथ शुरू करना पड़ सकता है, अन्यथा आप टार के साथ एक नया संग्रह बना सकते हैं ... इसलिए, पहले टार के अंत से फ़ाइलों को हटा दें।
अकीरा

5

मूल रूप से, आपको जिस चीज की आवश्यकता है, वह फ़ाइल को टार में पाइप करने की संभावना है, और सामने जाते ही "लोप" करें।

StackOverflow पर, किसी ने पूछा कि सामने किसी फ़ाइल को कैसे छोटा किया जाए , लेकिन ऐसा लगता है कि यह संभव नहीं है। आप फिर भी फ़ाइल की भीख को एक विशेष तरीके से जीरो से भर सकते हैं ताकि फ़ाइल एक विरल फ़ाइल बन जाए , लेकिन मुझे नहीं पता कि यह कैसे करना है। हम फ़ाइल के अंत को छोटा कर सकते हैं, हालाँकि। लेकिन टार को पीछे की ओर नहीं, बल्कि पुरालेख को पढ़ने की जरूरत है।

समाधान 1

अप्रत्यक्ष का एक स्तर हर समस्या को हल करता है। पहले फ़ाइल को इन-प्लेस करें, फिर उसे पीछे की ओर पढ़ें (जिसके परिणामस्वरूप मूल फ़ाइल आगे की ओर पढ़ी जाएगी) और उल्टे फ़ाइल के अंत को काट दें जैसे ही आप जाते हैं।

आपको एक प्रोग्राम लिखना होगा (c, python, जो भी हो) को भीख माँगने और फ़ाइल के अंत का आदान-प्रदान करने के लिए, chunk द्वारा chunk, और फिर इन chunks को एक बार में फ़ाइल को chunk करते समय tar में पाइप करें। यह समाधान 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

उन फ़ाइलों को टार में पाइप करें (ध्यान दें कि हमें दूसरे टर्मिनल में chunkprefix चर की आवश्यकता है):

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) का उपयोग करते हैं, इसलिए आपको एक बार में सभी विखंडू को पाइप करने की आवश्यकता नहीं है। यह उपयोगी हो सकता है यदि आप वास्तव में अंतरिक्ष पर तंग हैं। आप निम्न चरणों का पालन कर सकते हैं:

  • स्थानांतरित करें, अंतिम 10Gb चंक्स को एक और डिस्क पर कहें,
  • आपके पास अभी भी विखंडन के साथ निष्कर्षण शुरू करें,
  • जब 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-बिट पूर्णांक को सही ढंग से संभालना होगा (आपको इसके लिए 64-बिट कंप्यूटर और न ही ऑपरेटिंग सिस्टम की आवश्यकता नहीं है)। मेरा करता है, लेकिन यदि आप इन आवश्यकताओं के बिना किसी सिस्टम पर उपरोक्त स्क्रिप्ट चलाते हैं, तो आप आर्किटैक्स में सभी डेटा को ढीला कर देंगे

और किसी भी स्थिति में इसके अलावा कुछ गलत हो जाता है, तो आप आर्किटेकैट में वैसे भी सभी डेटा को ढीला कर देंगे, इसलिए सुनिश्चित करें कि आपके पास आपके डेटा का बैकअप है।


0

यदि आपके पास ऑब्जेक्ट फ़ाइलों को स्थानांतरित करने के लिए है, तो उन्हें अलग करने का प्रयास करें। इससे काफी मात्रा में जगह बच जाएगी।

$ strip `find . -name "*.bin"`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.