टार, gz, zip या bzip2 [बंद] का उपयोग करके स्प्लिट फ़ाइलें


144

मुझे लगभग 17-20 जीबी की एक बड़ी फ़ाइल को संपीड़ित करने की आवश्यकता है। मुझे इसे लगभग 1GB प्रति फ़ाइल की कई फ़ाइलों में विभाजित करने की आवश्यकता है।

मैंने Google के माध्यम से एक समाधान की खोज की और उपयोग करने के तरीके splitऔर catआदेश पाए । लेकिन वे बड़ी फ़ाइलों के लिए बिल्कुल भी काम नहीं करते थे। इसके अलावा, वे विंडोज में काम नहीं करेंगे; मुझे इसे विंडोज मशीन पर निकालने की आवश्यकता है।


3
मुझे आपका दर्द महसूस हो रहा है लेकिन यह संबंधित प्रोग्रामिंग नहीं लगती है।
जेसन एस

1
कई संपीड़न कार्यक्रम (जैसे 7-ज़िप) आसान वितरण के लिए एक निर्दिष्ट आकार के संस्करणों में संपीड़ित फ़ाइल को विभाजित करने में सक्षम है।
मार्टिन लीवरेज

यह superuser.com पर है, लेकिन निजी बीटा कल तक शुरू नहीं होता है, मुझे बताया गया है।
जेस्पर

क्या मैं पूछ सकता हूं कि आपको उस फ़ाइल को संपीड़ित करने की आवश्यकता क्यों है?
15

यदि यहां पोस्ट किए गए दो व्यवहार्य समाधानों में से एक भी पैन नहीं करता है, तो उसे प्रोग्रामिंग समाधान की आवश्यकता होगी।
जोशुआ

जवाबों:


253

आप विकल्प के splitसाथ कमांड का उपयोग कर सकते हैं -b:

split -b 1024m file.tar.gz

यह @ जोशुआ के उत्तर का उपयोग करके एक विंडोज मशीन पर फिर से जोड़ा जा सकता है ।

copy /b file1 + file2 + file3 + file4 filetogether

संपादित करें : जैसा कि @Charlie नीचे टिप्पणी में कहा गया है, आप स्पष्ट रूप से एक उपसर्ग सेट करना चाहते हैं क्योंकि यह xअन्यथा उपयोग करेगा , जो भ्रामक हो सकता है।

split -b 1024m "file.tar.gz" "file.tar.gz.part-"

// Creates files: file.tar.gz.part-aa, file.tar.gz.part-ab, file.tar.gz.part-ac, ...

संपादित करें : पोस्ट को संपादित करना क्योंकि सवाल बंद है और सबसे प्रभावी समाधान इस उत्तर की सामग्री के बहुत करीब है:

# create archives
$ tar cz my_large_file_1 my_large_file_2 | split -b 1024MiB - myfiles_split.tgz_
# uncompress
$ cat myfiles_split.tgz_* | tar xz

जब (डी) कंप्रेसिंग होती है तो यह समाधान एक इंटरमीडिएट बड़ी फ़ाइल का उपयोग करने की आवश्यकता से बचता है। परिणामी फ़ाइलों के लिए एक अलग निर्देशिका का उपयोग करने के लिए टार्क -C विकल्प का उपयोग करें। btw अगर संग्रह में केवल एक ही फ़ाइल है, तो टार को टाला नहीं जा सकता है और केवल gzip का उपयोग किया जाता है:

# create archives
$ gzip -c my_large_file | split -b 1024MiB - myfile_split.gz_
# uncompress
$ cat myfile_split.gz_* | gunzip -c > my_large_file

खिड़कियों के लिए आप एक ही कमांड के पोर्ट किए गए संस्करण डाउनलोड कर सकते हैं या साइबरविन का उपयोग कर सकते हैं।


7
यदि आप फ़ाइल नाम के बाद xaa, xab, xac, xad .... में आउटपुट प्राप्त करने के लिए फ़ाइलनाम के बाद अंतिम तर्क के रूप में एक उपसर्ग नहीं जोड़ते हैं ....
चार्ली

@ चेरली, धन्यवाद, मैंने अपना जवाब अपडेट किया।
परिपक्व जूल

2
वास्तव में उपयोग -b 1024MiBने एक त्रुटि दी कि यह एक अमान्य संख्या में बाइट्स था। --bytes=1024mकार्यों का उपयोग करना ।
ब्रायन

और आपको catफ़ाइल को फिर से इकट्ठा करने के लिए उपयोग करने की आवश्यकता नहीं है । आप copy /b file1 + file2 + etc..विंडोज पर उपयोग कर सकते हैं , फिर वापस लिनक्स पर कॉपी कर सकते हैं और टार रिम्सम्बल टारबॉल पढ़ सकते हैं। मैंने बस कोशिश की।
ब्रायन

1
स्प्लिट में विकल्प है --numeric-suffixes: अल्फाबेटिक के बजाय न्यूमेरिक प्रत्ययों का उपयोग करें।
डॉ। जन-फिलिप गेहरके

27

यदि आप लिनक्स से अलग हो रहे हैं, तो भी आप विंडोज में फिर से जुट सकते हैं।

copy /b file1 + file2 + file3 + file4 filetogether

आप इसका भी उपयोग कर सकते हैं copy /b file* filetogether- support.microsoft.com/kb/71161
eug

5
यह केवल NTFS पर सही ढंग से काम करता है और यदि फाइल NTFS में पहले से ही क्रमबद्ध हैं। इसे FAT या FAT32 = बूम पर आज़माएं।
जोशुआ

+1 सुनिश्चित करें कि फाइलें सही क्रम में हैं!
ब्रायन

@Joshua निष्पक्ष होने के लिए, यदि वे नहीं हैं, तो आपने एक खराब काम किया है।
jpmc26

@ jpmc26: आप जानते हैं कि FAT32 की खराब डायरेक्टरी रिडरिंग की आदतों के बारे में सही है?
जोशुआ


8

परीक्षण किया गया कोड, शुरू में एक एकल संग्रह फ़ाइल बनाता है, फिर उसे विभाजित करता है:

 gzip -c file.orig > file.gz
 CHUNKSIZE=1073741824
 PARTCNT=$[$(stat -c%s file.gz) / $CHUNKSIZE]

 # the remainder is taken care of, for example for
 # 1 GiB + 1 bytes PARTCNT is 1 and seq 0 $PARTCNT covers
 # all of file
 for n in `seq 0 $PARTCNT`
 do
       dd if=file.gz of=part.$n bs=$CHUNKSIZE skip=$n count=1
 done

यह वैरिएंट एकल संग्रह फ़ाइल बनाता है और सीधे भागों को बनाने के लिए जाता है:

gzip -c file.orig |
    ( CHUNKSIZE=1073741824;
        i=0;
        while true; do
            i=$[i+1];
            head -c "$CHUNKSIZE" > "part.$i";
            [ "$CHUNKSIZE" -eq $(stat -c%s "part.$i") ] || break;
        done; )

इस प्रकार में, यदि संग्रह का फ़ाइल आकार विभाज्य है $CHUNKSIZE, तो अंतिम आंशिक फ़ाइल में फ़ाइल आकार 0 बाइट होगा।


1
जो splitपहले से ही है।
ephemient

1
ephemient अरे, मैं कुछ पोस्ट बस के लिए देख खुदाई है। मेरे पास एक निश्चित डिवाइस पर कोई विभाजन और न ही जिप कमांड / बायनेरी नहीं है, और इसने पूरी तरह से काम किया है। मैं इस कोड को स्प्लिट कमांड :) के रूप में काम करने के लिए तैयार करूंगा। बहुत धन्यवाद @ एड्रियन पानसियुक। मेरे लिए यह बहुत अच्छा है।
m3nda

@ erm3nda आपका स्वागत है, खुशी है कि यह मदद करता है!
एड्रियन पानसियुक

लेकिन, मैंने परीक्षण किया है और परिणाम पूर्ण फ़ाइल था, विभाजन नहीं। यह कैसे हो सकता है? एक छोटे उपकरण पर एक बड़ी फ़ाइल थी, इसलिए एक लंबी प्रक्रिया थी। कृपया पोस्ट करते समय अपने समाधान का परीक्षण करें :(
m3nda

@ erm3nda आपने हमें कभी नहीं बताया कि आपको एक अस्थायी फ़ाइल बनाने से बचने की आवश्यकता है! कृपया दूसरा संस्करण देखें!
एड्रियन पानसियुक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.