मैं कमांड लाइन से फाइल को छोटा कैसे कर सकता हूं?


9

मेरे पास 150GB xml फ़ाइल है जिसे मैं लगभग 1GB तक छोटा (यानी छोटा) करना चाहूंगा - क्या एक साधारण (bash या समान) कमांड है जिसका मैं उपयोग कर सकता हूं, या क्या मुझे प्रोग्रामेटिक रूट (इसे vi या emacs में संपादित करना है) क्या लोहे के बड़े सिस्टम पर भी बुरा सपना है)?

(मैं जानकारी के नुकसान के बारे में स्पष्ट रूप से चिंतित नहीं हूं, मुझे एक छोटी फ़ाइल चाहिए, इसलिए मैं इस पर सॉफ़्टवेयर के एक टुकड़े का परीक्षण कर सकता हूं और जवाब के लिए कई घंटे इंतजार नहीं कर सकता, एक छोटी फ़ाइल मुझे ऐसा करने की अनुमति देगी।)


1
क्या आपका मतलब है कि आप फ़ाइल को छोटा करना चाहते हैं, या क्या आप पूरी फ़ाइल से जानकारी निकालना चाहते हैं?
AFH

1
SO पर यह मिला; stackoverflow.com/a/15934078/2800918
CAB

2
चूंकि यह एक XML फ़ाइल है, जो मुझे लगता है कि इसमें बड़ी संख्या में तत्वों के साथ एक अनुक्रम है, तो आप इन तत्वों की एक निश्चित संख्या को फ़िल्टर करने के लिए एक XML रूपांतरण भाषा जैसे XQuery का भी उपयोग कर सकते हैं, जो वैध XML को आउटपुट करने के लिए लाभ होगा। ( उदाहरण )
हारून

4
क्या फ़ाइल को अभी भी वैध XML होने की आवश्यकता है?
जो

1
नहीं, मैंने इसे अभी-अभी पैच किया है, इसलिए
एड्रिनमेकमिनामिन

जवाबों:


15

मान लें कि आप 150 GB फ़ाइल के पहले 1 GB को छोटा और निकालना चाहते हैं:

के साथ head:

head -c 1G infile > outfile

ध्यान दें कि Gप्रत्यय GB1024 के बजाय 1000 के साथ संरेखित किया जा सकता है ।

या साथ dd:

dd if=infile of=outfile bs=1M count=1024

या के रूप में Wumpus Q. Wumbley के उत्तर में, ddजगह में छंटनी कर सकते हैं।


5
ऐसा होने पर संभवतः पढ़ने योग्य XML फ़ाइल में परिणाम नहीं होगा।
जो

3
@ जो - ओपी ने एक पठनीय फ़ाइल का अनुरोध नहीं किया (न ही उन्होंने कहा कि यह अपठनीय हो सकता है)। उन्होंने कहा कि उन्होंने जानकारी के नुकसान की परवाह नहीं की। मैं ओपी से एक नए सवाल की उम्मीद करूंगा कि कैसे उक्त फाइल को ठीक किया जाए।
केविनडिम

3
मैं इसे ठीक करने के लिए पर्याप्त xml जानता हूं, मैंने प्रारूप के लिए DTD लिखा था!
adrianmcmenamin

37

फ़ाइल को 1 गीगाबाइट में विभाजित करने के लिए, truncateकमांड का उपयोग करें :

truncate -s 1G file.xml

ट्रंकेशन का परिणाम संभवतः एक वैध XML फ़ाइल नहीं होगा, लेकिन मैं इकट्ठा करता हूं कि आप इसे समझते हैं।

की जीएनयू संस्करण के लिए प्रलेखन truncateहै यहाँ और प्रलेखन के लिए बीएसडी संस्करण है यहां


14

जहाँ संभव हो, मैं truncateJohn1024 के उत्तर में कमांड का उपयोग करूँगा । हालांकि, यह एक मानक यूनिक्स कमांड नहीं है, इसलिए हो सकता है कि आप किसी दिन इसका उपयोग करने में स्वयं को असमर्थ पाएं। उस मामले में, ddएक जगह में छंटनी भी कर सकते हैं।

ddडिफ़ॉल्ट व्यवहार उस बिंदु पर आउटपुट फ़ाइल को छोटा करना है जहां प्रतिलिपि समाप्त होती है, इसलिए आप इसे केवल 0-लंबाई की इनपुट फ़ाइल दें और इसे वांछित ट्रंकेशन बिंदु पर लिखना शुरू करें:

dd if=/dev/null of=filename bs=1048576 seek=1024

(यह ddमल्टीथ्रैट 3 डी के उत्तर में कॉपी-एंड- ट्रंकट के समान नहीं है।)

ध्यान दें कि मैंने 1048576 और 1024 का उपयोग किया है क्योंकि 1048576 * 1024 वांछित आकार है। मैं बचा bs = 1 मी क्योंकि यह एक "पोर्टेबिलिटी" जवाब है, और क्लासिक ddकेवल प्रत्यय जानता है k, bऔर w


2
सामान्य समाधान के लिए, आपको संभवतः ध्यान देना चाहिए कि bsसंख्या को गुणा seekसंख्या को रखने के लिए बाइट्स की संख्या है। कोई भी दो संख्याएँ जो इस बात को संतुष्ट करती हैं कि बाधा काम करना चाहिए; जैसे, bs=1073741824 seek=1या bs=1 seek=1073741824। या, bsचूक से 512 तक, seek=2097152अकेले भी काम करना चाहिए। और अगर आप की तरह संकेतन का उपयोग कर सकते हैं 1M, 1K, 1Gऔर 2M
जी-मैन का कहना है कि 'मोनिका'

1

मुझे पूरा यकीन नहीं है कि आप क्या पूछ रहे हैं। क्या आप केवल अन्य 149GB से छुटकारा पाना चाहते हैं या आप 150 जीबी को 1 जीबी में संपीड़ित करने की कोशिश कर रहे हैं? इसके बावजूद, इसे पूरा करने के लिए यह एक उपयोगी तरीका हो सकता है।

splitआदेश कई टुकड़ों में किसी भी फाइल विभाजित कर सकते हैं। आदमी को विभाजित देखें । आप उस फ़ाइल का आकार निर्दिष्ट कर सकते हैं जिसे आप -bविकल्प के साथ विभाजित करना चाहते हैं । उदाहरण के लिए:

$ विभाजन -b 1GB myfile.xml

किसी भी अन्य विकल्प के बिना यह पत्र के साथ शुरू होने वाली वर्तमान निर्देशिका में कई फाइलें बनाना चाहिए x। यदि आप विभाजित फ़ाइलों के नामों को समायोजित करना चाहते हैं तो मैन पेज देखें।

फ़ाइल का उपयोग फिर से इकट्ठा करने के लिए cat * > re-assembled.xml

उदाहरण:

[kent_x86.py@c7 split-test]$ ls -l opendocman*
-rw-rw-r--.  1 kent_x86.py kent_x86.py 2082602 Mar 31  2017 opendocman-1.3.5.tar.gz

[kent_x86.py@c7 split-test]$ split -b 100K opendocman-1.3.5.tar.gz 
[kent_x86.py@c7 split-test]$ ls
opendocman-1.3.5.tar.gz  xaa  xab  xac  xad  xae  xaf  xag  xah  xai  xaj  xak  xal  xam  xan  xao  xap  xaq  xar  xas  xat  xau
[kent_x86.py@c7 split-test]$ ll
total 4072
-rw-rw-r--. 1 kent_x86.py kent_x86.py 2082602 Jan  5 11:06 opendocman-1.3.5.tar.gz
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaa
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xab
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xac
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xad
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xae
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaf
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xag
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xah
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xai
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaj
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xak
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xal
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xam
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xan
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xao
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xap
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaq
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xar
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xas
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xat
-rw-rw-r--. 1 kent_x86.py kent_x86.py   34602 Jan  5 11:06 xau
[kent_x86.py@c7 split-test]$ cat xa* > opendoc-reassembled.tar.gz
[kent_x86.py@c7 split-test]$ ls -l opendoc-reassembled*
-rw-rw-r--. 1 kent_x86.py kent_x86.py 2082602 Jan  5 11:07 opendoc-reassembled.tar.gz


0

अंत में मैंने सिर्फ sedएक मनमानी संख्या निकालने के लिए उपयोग किया :

sed -n 1,1000000p infile.xml>outfile.xml

1
यह कहते हुए कि यह सवाल का जवाब देता है या नहीं, यह पूरी फाइल को स्कैन करेगा, मुझे विश्वास है, इसलिए यह उपयोग करने के लिए बहुत अधिक कुशल है sed 1000000q(और थोड़ा अधिक कॉम्पैक्ट, नेत्रहीन बोलना)।
बी लेयर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.