उन्हें विभाजित करने के बाद फिर से फ़ाइलों में शामिल होने का सबसे अच्छा तरीका क्या है?


73

अगर मेरे पास एक बड़ी फाइल है और उसे 100 मेगाबाइट चंक्स में विभाजित करने की आवश्यकता है तो मैं करूंगा

split -b 100m myImage.iso

कि आम तौर पर मुझे कुछ पसंद है

xaa
xab
xac
xad

और उन्हें वापस पाने के लिए मैं उपयोग कर रहा हूं

cat x* > myImage.iso

ऐसा लगता है कि फ़ाइलों के एक समूह में कोड की प्रत्येक पंक्ति के माध्यम से पढ़ने catऔर आउटपुट को एक नई फ़ाइल पर पुनर्निर्देशित करने की तुलना में अधिक कुशल तरीका होना चाहिए । जैसे दो फ़ाइलों को खोलने का एक तरीका है, EOFपहले एक से मार्कर को हटाना , और उन्हें जोड़ना - बिना सभी सामग्रियों के गुजरना।

विंडोज / डॉस में बाइनरी फ़ाइलों के लिए एक कॉपी कमांड है। सहायता में उल्लेख किया गया है कि इस कमांड को कई फाइलों को संयोजित करने में सक्षम बनाया गया था। यह इस सिंटैक्स के साथ काम करता है: ( /bबाइनरी मोड के लिए है)

copy /b file1 + file2 + file3 outputfile

क्या बिल्ली की तुलना में लिनक्स पर बड़ी फ़ाइलों में शामिल होने के लिए कुछ समान या बेहतर तरीका है?

अपडेट करें

ऐसा लगता है कि catवास्तव में फाइलों में शामिल होने का सही तरीका और सबसे अच्छा तरीका है। मुझे यह जानकर खुशी हुई कि मैं सभी के साथ सही कमांड का उपयोग कर रहा था :) आपकी प्रतिक्रिया के लिए सभी को धन्यवाद।


22
साइड नोट: बेहतर उपयोग नहीं cat x*, क्योंकि फाइलों का क्रम आपकी लोकेल सेटिंग पर निर्भर करता है। बेहतर शुरू टाइप करें cat x, प्रेस Esc से और फिर *- आप फ़ाइलों का विस्तारित क्रम देखेंगे और पुनर्व्यवस्थित कर सकते हैं।
रोज़ज़ेट्रिएवेज़ेज़

16
इसके बजाय cat x*आप शेल ब्रेस विस्तार पर विचार कर सकते हैं, cat xa{a..g}जो निर्दिष्ट अनुक्रम को cat xaa xab xac xad xae xaf xag
Peter.O

3
@rozcietrzewiacz - क्या आप इस बात का उदाहरण दे सकते हैं कि मैं अपनी लोकेल सेटिंग को कैसे समायोजित करूँगा जो टूट जाएगी cat x*? नए स्थानीय सेटिंग भी कोई असर नहीं पड़ेगा splitताकि अगर splitऔर cat x*एक ही सिस्टम पर इस्तेमाल किया गया है कि वे हमेशा काम करेगा?
cwd 15'11

3
"दो फ़ाइलों को खोलने, पहले एक से EOF मार्कर को हटाने, और उन्हें जोड़ने -। सभी सामग्री के माध्यम से जाने के बिना" ... लगता है कि आप आदेश आप क्या चाहते करने के लिए एक नई फाइल सिस्टम का आविष्कार करने की जरूरत है
JoelFan

6
@ सीडब्ल्यूडी: split.cजीएनयू कोर्यूटिल्स में देखते हुए , प्रत्ययों को एक निश्चित वर्ण से निर्मित किया जाता है static char const *suffix_alphabet = "abcdefghijklmnopqrstuvwxyz";:। प्रत्यय स्थान से प्रभावित नहीं होगा। (लेकिन मुझे नहीं लगता कि कोई भी समझदार लोअरकेस अक्षरों को फिर से लिख देगा; यहां तक ​​कि EBCDIC उनके मानक आदेश को बनाए रखता है।)
कीथ थॉम्पसन

जवाबों:


50

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


cat x, then press Escआपके द्वारा बताई गई ट्रिक साफ-सुथरी है। मैं कुछ इस तरह की तलाश में था, धन्यवाद ... अच्छी टिप्पणी और अच्छा जवाब
पीटर।

2
आपका स्वागत है :) इसके अलावा, जब आपके पास कमांड लाइन पर फ़ाइलों की सूची है, तो आप Ctrl+Wएक शब्द को काटकर Ctrl+Yउसका पेस्ट करने के लिए उपयोग कर सकते हैं ।
रोज़ज़ेट्रिएवेज़ेज़

बिल्ली का अर्थ है "समवर्ती"
जोएलफैन

4
.. और एक लैटिन शब्द "शृंखला" जो "एक श्रृंखला" का अर्थ है "से कड़ी लगाकर जोड़ना" derrives .. श्रृंखलाबद्ध एक श्रृंखला के लिंक शामिल हो रहा है। ... और थोड़ा आगे विषय, एक कैटेनरी वक्र भी "कैटैना" से निकलता है। यह एक तरह से चेन लटका हुआ है)
पीटर।

19

हुड के नीचे

पहली फ़ाइल की प्रतिलिपि बनाने से अधिक कुशल तरीका नहीं है, फिर उसके बाद दूसरी फ़ाइल की प्रतिलिपि बनाना, और इसी तरह। दोनों डॉस copyऔर catकरते हैं।

प्रत्येक फ़ाइल को डिस्क पर अन्य फ़ाइलों के स्वतंत्र रूप से संग्रहीत किया जाता है। लगभग हर फाइलसिस्टम को डिस्क जैसी डिवाइस पर डेटा स्टोर करने के लिए डिज़ाइन किया गया है जो ब्लॉक द्वारा संचालित होता है। यहाँ क्या होता है की एक उच्च सरलीकृत प्रस्तुति है: डिस्क को 1kB के ब्लॉक में विभाजित किया गया है, और प्रत्येक फ़ाइल के लिए ऑपरेटिंग सिस्टम उन ब्लॉकों की सूची संग्रहीत करता है जो इसे बनाते हैं। अधिकांश फाइलें ब्लॉक की एक पूर्णांक संख्या नहीं हैं, इसलिए अंतिम ब्लॉक केवल आंशिक रूप से कब्जा है। व्यवहार में, फाइलसिस्टम में कई अनुकूलन होते हैं, जैसे कई फ़ाइलों के बीच अंतिम आंशिक ब्लॉक साझा करना या "ब्लॉक 46798, ब्लॉक 46799, ..." के बजाय "ब्लॉक 46798 से 47913" संग्रहीत करना। जब ऑपरेटिंग सिस्टम को एक नई फ़ाइल बनाने की आवश्यकता होती है, तो यह मुफ्त ब्लॉक की तलाश करता है। ब्लॉक को लगातार नहीं होना चाहिए: यदि केवल ब्लॉक 4, 5, 98 और 178 मुक्त हैं, तो आप अभी भी 4kB फाइल स्टोर कर सकते हैं।

आप मध्य-फाइल में आंशिक ब्लॉकों का समर्थन कर सकते हैं, लेकिन यह काफी जटिलता जोड़ देगा, खासकर जब गैर-क्रमिक रूप से फ़ाइलों तक पहुंच: 10340 वें बाइट पर जाने के लिए, आप अब 11 वें ब्लॉक के 100 वें बाइट पर नहीं कूद सकते, आपके पास होगा हर हस्तक्षेप ब्लॉक की लंबाई की जांच करने के लिए।

ब्लॉकों के उपयोग को देखते हुए, आप सिर्फ दो फ़ाइलों में शामिल नहीं हो सकते, क्योंकि सामान्य रूप से पहली फ़ाइल मध्य-ब्लॉक में समाप्त होती है। निश्चित रूप से, आपके पास एक विशेष मामला हो सकता है, लेकिन केवल तभी जब आप दोनों फ़ाइलों को हटाना चाहते हैं। यह एक दुर्लभ ऑपरेशन के लिए एक अत्यधिक विशिष्ट हैंडलिंग होगी। इस तरह की विशेष हैंडलिंग अपने आप नहीं रहती है, क्योंकि एक विशिष्ट फाइल सिस्टम पर, एक ही समय में कई फ़ाइल एक्सेस की जा रही हैं। इसलिए यदि आप एक अनुकूलन जोड़ना चाहते हैं, तो आपको ध्यान से सोचने की आवश्यकता है: यदि कोई अन्य प्रक्रिया शामिल फ़ाइलों में से एक को पढ़ रही है तो क्या होगा? यदि कोई व्यक्ति A और B को समाप्‍त करने का प्रयास करता है जबकि कोई A और C को समाप्‍त कर रहा है, तो क्‍या होगा? और इसी तरह। कुल मिलाकर, यह दुर्लभ अनुकूलन एक बहुत बड़ा बोझ होगा।

सब के सब, आप प्रमुख बलिदान किए बिना कहीं और फाइलों को अधिक कुशल नहीं बना सकते। यह इसके लायक नहीं है।

बिछड़ने और जुड़ने पर

splitऔर catफ़ाइलों के विभाजन और जुड़ने के सरल तरीके हैं। splitवर्णमाला क्रम में नामित फ़ाइलों के उत्पादन का ख्याल रखता है, ताकि cat *जुड़ने के लिए काम करता है।

catशामिल होने के लिए नकारात्मक पक्ष यह है कि यह सामान्य विफलता मोड के खिलाफ मजबूत नहीं है। यदि फ़ाइलों में से एक को काट दिया गया है या गायब है, catतो शिकायत नहीं करेंगे, आपको बस क्षतिग्रस्त आउटपुट मिलेगा।

संपीड़न उपयोगिताओं हैं जो मल्टीपार्ट अभिलेखागार का उत्पादन करते हैं, जैसे कि zipsplitऔर rar -v। वे बहुत अयोग्य नहीं हैं, क्योंकि वे विभाजन और एक में कई फ़ाइलों को इकट्ठा करते हैं और पैक करते हैं (और साथ ही अनपैक करने और जुड़ने के अलावा अनपैक करने के लिए)। लेकिन वे इसमें उपयोगी हैं कि वे यह सत्यापित करें कि आपके पास सभी भाग हैं, और यह कि वे भाग पूरे हो चुके हैं।


8

लगता है जैसे सिस्टम के माध्यम से सभी सामग्रियों को पाइप करने की तुलना में अधिक कुशल तरीका होना चाहिए stdin/stdout

सिवाय इसके कि वास्तव में क्या हो रहा है। खोल cat सीधे फ़ाइल के स्टैडआउट को कनेक्ट कर रहा है , जिसका अर्थ है कि "स्टडआउट से गुजरना" डिस्क पर लिखने के समान है।


मैं बस कंसोल में कई गीगाबाइट कोड प्रदर्शित करने के लिए बिल्ली का उपयोग करने की कल्पना कर रहा था, फिर इसे पकड़कर एक फ़ाइल में डाल दिया। यही कारण है कि जब मैं बिल्ली का उपयोग करता हूं और मेरे द्वारा देखे जाने वाले आउटपुट को पुनर्निर्देशित करता है, तो उसके लिए मेरे पास होने वाली मानसिक छवि है। यह सिर्फ ऐसा लगता है कि अगर कोई ऐसा तरीका था जिससे आप दो फाइलें खोल सकते थे, उन्हें जोड़ सकते थे, और फिर उन्हें बंद कर सकते थे, तो यह कोड की सभी लाइनों के माध्यम से चलने की तुलना में अधिक कुशल होगा cat। मुझे सीधे कनेक्शन के बारे में बताने के लिए धन्यवाद।
cwd

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

@ गिल्स - निम्न स्तर के विवरण के बारे में अधिक जानना दिलचस्प होगा। मेरे लिए, कई फ़ाइलों के लिए हार्ड डिस्क से सभी क्षेत्रों को पढ़ना और फिर उन्हें डिस्क पर अन्य अप्रयुक्त क्षेत्रों में वापस फेंकना अक्षम लगता है। और मुझे लगता है कि बड़ी फ़ाइलों को कई बार मुक्त क्षेत्रों के कई ब्लॉकों में संग्रहित किया जाना चाहिए, क्योंकि उन्हें संग्रहीत करने के लिए हमेशा पर्याप्त ब्लॉक नहीं हो सकते हैं। इसलिए सैद्धांतिक रूप से आप EOF मार्कर को हटाकर अगली फ़ाइल की शुरुआत में सेक्टरों के समूह की ओर इशारा करते हुए फाइलों में शामिल हो सकते हैं। * निक्स शक्तिशाली है इसलिए मुझे आश्चर्य हुआ कि क्या बिल्ली की तुलना में बेहतर तरीका था।
सीडब्ल्यूडी

@cwd कोई "EOF मार्कर" नहीं है। कोई भी सेंस आधुनिक फाइलसिस्टम उस तरह से काम नहीं करता है, क्योंकि यह कुछ पात्रों को फाइलों में होने से रोकता है (या फिर जटिल इनकोडिंग की आवश्यकता होती है)। लेकिन यहां तक ​​कि अगर एक ईओएफ मार्कर था, तो अधिकांश समय, आपके पास इसके बाद सही फ़ाइल नहीं होगी।
गाइल्स

मेरा मतलब था ईओएफ मार्कर की अवधारणा और वास्तविक ईओएफ मार्कर नहीं। अन्यथा यदि आप हार्ड ड्राइव पर किसी फ़ाइल के बिट्स और बाइट्स को देखते हैं, तो आप कैसे जानते हैं कि यह कहाँ समाप्त होता है? क्या आप इसकी शुरुआत में फ़ाइल की लंबाई निर्दिष्ट करते हैं? मैं वास्तव में निम्न स्तर की बात कर रहा हूं। क्या आप भी इसका जिक्र कर रहे हैं?
cwd

3

मुझे एक बार इस समस्या का सामना करना पड़ा था: मैं कुछ फ़ाइलों में शामिल होना चाहता था, लेकिन उनके पास दोगुना रखने के लिए पर्याप्त डिस्क स्थान नहीं था।

इसलिए मैंने कार्यक्रमों का एक समूह लिखा:

  • एक फ़ाइल को पढ़ने के लिए एक "चूसना", इसे stdout को भेजना और, यदि समाप्त हो गया, तो इसे हटा देना
  • और एक डेटा "मक्खी पर" बफर करने के लिए।

इसने मुझे कुछ ऐसा करने में सक्षम बनाया

partto sourcefile | mybuffer 128M >>cumufile

और इस प्रकार स्रोत फ़ाइल को हटाते समय 128M अभी भी अलिखित था। थोड़ा खतरनाक है, लेकिन अगर डेटा उतना कीमती नहीं है, या वे कहीं और मौजूद हैं, तो यह संभव है।

यदि आवश्यक हो, तो मैं स्रोत प्रदान कर सकता हूं।


0

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

$ mkfifo myImage.iso
$ cat xa{a..g} > myImage.iso &

और फिर उपयोग करें myImage.iso, उदाहरण के लिए

$ md5sum myImage.iso

हालाँकि, myImage.isoएक विशेष फ़ाइल (पाइप का नाम) है और एक नियमित फ़ाइल नहीं है, इसलिए यह आपके द्वारा उपयोग किए जा रहे काम के आधार पर उपयोग या नहीं हो सकता है।


0

फ़ाइलें विभाजन

आकार से विभाजित

यदि आप बड़ी फ़ाइल को छोटी फ़ाइलों में विभाजित करना चाहते हैं और छोटी आउटपुट फ़ाइलों का नाम और आकार चुनें तो यह तरीका है।

split -b 500M videos\BigVideoFile.avi SmallFile.

इस तरह आप 500 एमबी के छोटे भागों में एक बड़ी फ़ाइल को विभाजित करना चुनते हैं। इसके अलावा आप चाहते हैं कि भाग फ़ाइलों का नाम SmallFile है। ध्यान दें कि फ़ाइल नाम के बाद आपको डॉट की आवश्यकता है । परिणाम इस तरह से नई फ़ाइलों की पीढ़ी होना चाहिए:

SmallFile.ab SmallFile.ad SmallFile.af SmallFile.ah SmallFile.aj
SmallFile.aa SmallFile.ac SmallFile.ae SmallFile.ag SmallFile.ai SmallFile.ak
...

लाइनों की संख्या से विभाजित

इस तरह आप टेक्स्ट फाइल को 50 लाइनों तक सीमित छोटी फाइलों में विभाजित कर देंगे।

split -l 50 text_to_split.txt

परिणाम कुछ इस तरह होना चाहिए:

xaa xab xac ...

बाइट से विभाजित

बाइट्स में छोटी फ़ाइलों के कस्टम आकार के साथ छोटी फ़ाइलों में विभाजित करें:

split -b 2048 BigFile.mp4

परिणाम बंटवारे की संख्या के परिणाम के समान होना चाहिए ।

फ़ाइलें जुड़ना

आप दो तरीकों से फ़ाइलों को जोड़ सकते हैं। पहला एक है:

cat SmallFile.* > OutputBigVideoFile.avi

या साथ:

cat SmallFile.?? > OutputBigVideoFile.avi

नोट: जब आप फाइलों में शामिल हो रहे हैं तो छोटी फाइलें क्षतिग्रस्त नहीं होनी चाहिए। साथ ही सभी छोटी (भाग) फाइलें एक ही डायरेक्टरी में होनी चाहिए।

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