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