फ़ाइल को वांछित आकार में कैसे पैड करें?


15

मेरे पास एक फाइल है जिसे मैं 16 MiB (16777216 बाइट्स) तक पहुंचाना चाहता हूं। वर्तमान में यह 16515072 बाइट्स है। अंतर 262144 बाइट्स है।

मैं इसे कैसे पैड करूं?

यह काम नहीं कर रहा है:

cp smallfile.img largerfile.img
dd if=/dev/zero of=largerfile.img bs=1 count=262144

2
@terabyte; क्या आप शारीरिक गद्दी या तार्किक गद्दी चाहते हैं? दूसरे शब्दों में; क्या फ़ाइल केवल 16777216 का आकार दिखा सकती है (और इसमें छेद हो सकते हैं) या क्या डिस्क पर भंडारण की मात्रा भी होगी? - BTW, में एक bs=1का चयन ddमेरे अनुभव में बहुत रनटाइम महंगा है।
Janis


4
@frostschutz जो एक अच्छा जवाब होगा, क्या आप इसे उत्तर के रूप में पोस्ट कर रहे थे।
व्युत्पन्न

@derobert, StackExchange साइट उपयोगकर्ताओं को टिप्पणियों के रूप में वैध, सरल उत्तर पोस्ट करने के साथ क्या है?
user1717828

@ user1717828 यकीन नहीं हुआ, शायद मेटा के लिए एक अच्छा सवाल है।
अपमानजनक

जवाबों:


10

of=largerfile.txtफ़ाइल में स्टडआउट को छोड़ें और जोड़ें:

dd if=/dev/zero bs=1 count=262144 >> largerfile.txt

1
seekयहाँ एक सही विकल्प है।

15

एक भौतिक पैडिंग प्राप्त करने के उत्तर के अलावा, आप फ़ाइल के अधिकांश खाली स्थान को केवल खाली ("छेद") में छोड़ सकते हैं, फ़ाइल seekके नए सिरे-स्थान की ओर और एकल वर्ण लिखकर:

dd if=/dev/zero of=largerfile.txt bs=1 count=1 seek=16777215

(जो विशेष रूप से साथ bs=1, और अधिक डिस्क स्थान पर बड़ी मात्रा में कब्जा नहीं करता है)

यह विधि किसी भी वर्ण को जोड़े बिना भी काम करना प्रतीत होता है, उपयोग करके if=/dev/nullऔर अंतिम वांछित फ़ाइल आकार:

dd if=/dev/null of=largerfile.txt bs=1 count=1 seek=16777216

एक भौतिक पैडिंग समाधान का एक बड़ा संस्करण जो बड़े ब्लॉक-आकार का उपयोग करता है:

padding=262144 bs=32768 nblocks=$((padding/bs)) rest=$((padding%bs))
{
  dd if=/dev/zero bs=$bs count=$nblocks
  dd if=/dev/zero bs=$rest count=1
} 2>/dev/null >>largerfile.txt

3
सही बात। इस मामले में truncate -s +262144 largerfile.txtभी तेजी होगी।
don_crissti

4

यहाँ पर सबसे अच्छा anwser Janis's (ऊपर) है क्योंकि यह आपको वर्तमान फ़ाइल आकार और पैड के बारे में बिना किसी गणना के सीधे वांछित आकार में भूल जाने देता है।

यह विरल फाइलों का भी लाभ उठाता है, जो / देव / शून्य नहीं है।

हालांकि इसका जवाब टिडियर हो सकता है, क्योंकि 'गिनती' को 0 होने की अनुमति है और आपको अभी भी गद्दी मिल रही है:

dd if=/dev/null of=largerfile.txt bs=1 count=0 seek=16777216

(संपादित करें: यह GNU dd के लिए सही है, लेकिन count=0प्लेटफ़ॉर्म-विशिष्ट का व्यवहार है, टिप्पणियां देखें)


आप गलत हैं: count=0अनिर्दिष्ट है, लेकिन आमतौर पर वही है जब कोई countपैरामीटर निर्दिष्ट नहीं किया गया था। अधिक समस्याएँ: ddफ़ाइल को 16777216 बाइट्स में विभाजित करता है, लेकिन यदि आप इस उम्मीद में हैं कि यह अंत में एक छेद बनाता है, तो आपसे गलती होती है क्योंकि आपको पहले छेद के बाद डेटा लिखने की आवश्यकता होती है और बाद में इसे एक ऐसे आकार में काट दिया जाता है जिसमें कोई डेटा नहीं होता है ।
विद्वान

count = 0 कुछ भी नहीं है जैसे कोई गिनती पैरामीटर निर्दिष्ट नहीं किया जाता है। क्या आप कह रहे हैं कि dd if=/dev/zero of=somefileजैसा है वैसा ही है dd if=/dev/zero of=somefile count=0? कोशिश करो।
पेटेक

बेशक! count=0 यह वैसा ही है जैसे कि आपने किसी गणना पैरामीटर को निर्दिष्ट नहीं किया है। यह कम से कम सभी कार्यान्वयनों के लिए सही है जो मूल स्रोतों से प्राप्त हुए हैं। यह कोशिश करो, ऐसा लगता है कि आपने मूल ddआदेश के साथ कभी काम नहीं किया ।
विद्वान

मुझे ऐसा कोई भी दस्तावेज़ नहीं मिला है जो 0 को विशिष्ट मान के रूप में निर्दिष्ट करता है countजिसका अर्थ है 'इस पैरामीटर को अनदेखा करना'। क्या आपको कोई मिल सकता है? इस तरह के प्रलेखन के बिना, का count=0अर्थ है 'शून्य ब्लॉक लिखें' और इसमें से कोई विचलन बग ... (मूल स्रोत या नहीं) है।
पेटेक

1
यह मई 2015 से पहले POSIX प्रलेखन था जब अंडरस्क्राइब किए गए पाठ को ठीक किया गया था।
विद्वान

1

क्या आपको उपयोग करना है dd? यदि आप एक विशेष (तार्किक) लंबाई वाली फ़ाइल चाहते हैं, तो अपनी इच्छित स्थिति के लिए एक शून्य लिखें। पिछले छोर और लिखित बाइट के बीच बाइट्स को शून्य बाइट्स के रूप में प्रदर्शित किया जाएगा। यहाँ पर्ल का उपयोग करके एक उदाहरण दिया गया है।

$ echo Hello > file
$ ls -l file
-rw-r--r-- 1 user group 6 Apr 16 22:59 file
$ perl -le 'open(my $f,"+<","file"); seek($f, 16777216 - 2, 0); print $f "\0"'
$ ls -ln file
-rw-r--r-- 1 user group 16777216 Apr 16 22:59 file

लाइन में "- 2" क्यों? स्क्रिप्ट एक बाइट लिखेगा, इसलिए हम उस बाइट से पहले स्थिति की तलाश करने के लिए 1 को घटाते हैं। हम दूसरे को हटा देते हैं क्योंकि तलाश की स्थिति शून्य-अनुक्रमित है।

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