आप कमांड लाइन का उपयोग करके फ़ाइलों को कैसे ट्रिम कर सकते हैं?


18

निम्नलिखित पायथन कोड के बराबर कंसोल क्या है:

target = file("disk", "w")    # create a file
target.seek(2*1024*1024*1024) # skip to 2 GB
target.write("\0")
target.close()

शायद कुछ dd incantation? विचार वर्चुअलाइजेशन में उपयोग के लिए 2 जीबी के स्पष्ट आकार के साथ एक फ़ाइल बना रहा है।

kvm disk -cd whatever.iso #Only allocate space as necessary

ddएकमात्र पारंपरिक उपकरण है जो seekसिस्टम कॉल को उजागर करता है (देखें dd vs cat - इन दिनों dd अभी भी प्रासंगिक है; लेकिन इस बिल्ली को विशिष्ट वर्तमान यूनियनों पर त्वचा करने के अन्य तरीके हैं।
गाइल्स का SO- बुराई होना बंद करें '

जवाबों:


8

आम तौर पर बोल, बस उपयोग dd; लेकिन जैसा कि आपने KVM वर्चुअलाइजेशन के उपयोग का उल्लेख किया है, आप उपयोग करने पर विचार कर सकते हैं qemu-img:

qemu-img create -f raw disk 2G

यह ddप्रभावी रूप से क्रिस डाउन के उत्तर में कमांड के समान है ।

वर्चुअलाइजेशन में उपयोग के लिए आप चाहे जो भी कमांड का उपयोग करें, मैं fallocateविखंडन को रोकने और प्रदर्शन को बढ़ाने के लिए पूर्व-आवंटित ब्लॉकों का उपयोग करने का दृढ़ता से सुझाव दूंगा।

fallocate -l 2G disk

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


क्या उद्धरण एक टाइपो है?
बी ए डी पी

@ सबद हां, तय हुआ।
gertvdijk

2
qemu-imgऔर ddदोनों फाइल साइज (फुट्रंकट) को सेट करने के लिए एक सिस्टम कॉल करते हैं , लेकिन खुद को और उन लाइब्रेरियों को लोड करने के लिए बहुत अधिक प्रदर्शन करेंगे जो वे जुड़े हुए हैं। और, उस संबंध में, ddबहुत अधिक प्रभावी होने जा रहा है qemu-img(जो बहुत बड़ा है और कहीं अधिक पुस्तकालयों से जुड़ा हुआ है)। जीएनयू truncateऔर भी प्रभावी होने जा रहा है। ddसर्वव्यापी होने का भी फायदा है। fallocateहालांकि अच्छी बात है ।
स्टीफन चेज़लस

@StephaneChazelas मैं आपकी टिप्पणी पूरी तरह से दूसरी है। मैंने अपने उत्तर को इंगित करने के लिए संपादित किया है जो कि qemu-imgKVM वर्चुअलाइजेशन के उपयोग में एक स्पष्ट विकल्प है।
gertvdijk

14

आप इस तरह से एक विरल फ़ाइल बना सकते हैं dd:

dd of=file bs=1 seek=2G count=0
$ du file
0       disk
$ du --apparent-size file
2097152 disk

4
इसके अलावा, 2Gएक GNU एक्सटेंशन है ddbs=1024 seek=2097152यदि आपके पास GNU नहीं है तो आप इसका उपयोग कर सकते हैं dd
क्रिस डाउन

हे, Gएक विस्तार है, और यह OpenBSD के dd के संस्करण द्वारा समर्थित नहीं है ... लेकिन, Mऔर Kसमर्थित हैं, इसलिए शायद seek=2048Mथोड़ा अधिक पठनीय है, इस बात पर निर्भर करता है कि आप किस प्लेटफॉर्म को लक्षित कर रहे हैं
अर्लज़

आपको / देव / शून्य से पढ़ना चाहिए: अगर = / देव / शून्य
डैनियल फंजुल

@DanielFanjul क्यों? बिल्कुल कोई अंतर नहीं है, कोई बाइट्स नहीं लिखे गए हैं।
क्रिस डाउन

@ क्रिसडाउन क्योंकि जब आप पढ़ते हैं तो dev / null में कोई डेटा नहीं होता है, लेकिन / dev / शून्य में infinte zeros होता है। ओह, गिनती = 1, लिखने के लिए बाइट्स की संख्या शून्य नहीं होनी चाहिए।
डेनियल फंजुल

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