UNIX में बड़ी फाइल कैसे बनाएं?


17

मुझे ऐसा काम करने के लिए विंडोज में एक रास्ता मिला

echo "This is just a sample line appended  to create a big file. " > dummy.txt
for /L %i in (1,1,21) do type dummy.txt >> dummy.txt

http://www.windows-commandline.com/how-to-create-large-dummy-file/

क्या UNIX में फ़ाइल, एपेंड को कॉपी करने और फिर प्रक्रिया को दोहराने का कोई तरीका है? कुछ पसंद है for .. cat file1.txt > file1.txt?


फाइल और कॉपी करने की बजाय सिर्फ एप्लाई क्यों करें?
123

@ 123 एपेंड अच्छा है, लेकिन लूप कैसे करें?
थॉमस ली

4
for i in {1..1000000};do echo "string" >> file;doneबाश में।
123

9
क्या यह एक पाठ फ़ाइल होना चाहिए? आप फ़ाइल का कोई भी आकार / dev / शून्य या / dev / urandom से बना सकते हैं।
रियलसेप्टिक

2
मैं type file >> fileएक अनंत लूप में चलने की उम्मीद करता हूं (कम से कम जैसे ही यह पर्याप्त रूप से बड़ा है कि यह एक बफर में फिट नहीं होता है)।
स्टीफन चेजलस

जवाबों:


29
yes "Some text" | head -n 100000 > large-file

के साथ csh/ tcsh:

repeat 10000 echo some test > large-file

के साथ zsh:

{repeat 10000 echo some test} > large-file

GNU सिस्टम पर, यह भी देखें:

seq 100000 > large-file

या:

truncate -s 10T large-file

(एक 10TiB विरल फ़ाइल बनाता है (बहुत बड़ी है, लेकिन डिस्क पर कोई स्थान नहीं लेता है) और अन्य विकल्पों पर चर्चा की "बहुत सारे बाइट्स के साथ एक परीक्षण फ़ाइल बनाएं"


करना cat file >> fileएक बुरा विचार होगा।

सबसे पहले, यह कुछ catकार्यान्वयन के साथ काम नहीं करता है जो उन फ़ाइलों को पढ़ने से इनकार करते हैं जो उनके आउटपुट फ़ाइल के समान हैं। लेकिन भले ही आप इसे करके काम करते हैं cat file | cat >> file, अगर fileयह catआंतरिक बफर से बड़ा है , तो यह catअनंत लूप में चलने का कारण होगा, क्योंकि यह उस डेटा को पढ़ना बंद कर देगा जो उसने पहले लिखा है।

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


19
या dd if=/dev/zero of=large-file bs=1024 count=10241 एमबी फ़ाइल के लिए
doneal24

7
@ डग'ओनल मुझे dd if=/dev/zero of=test bs=1M count=1स्पष्ट लगता है।
123


1
या यदि आप यादृच्छिक डेटा चाहते हैं तो / dev / शून्य के बजाय / dev / urandom का उपयोग करें।
user253751 1

3
@ robertotomás हाँ, हर कोई उपयोग करता है dd, लेकिन मुझे कभी समझ नहीं आया कि क्यों। वास्तव में, मुझे लगता है कि मैंने केवल एमबीआर या इसी तरह के फ्रिंज कार्यों को पढ़ने के लिए इसका उपयोग किया है। मेरे अनुभव में, अन्य उपकरण उन अधिकांश मामलों के लिए अधिक तेज़, सरल और सुरक्षित हैं जहां लोग उपयोग करते हैं dd। मुझे लगता है कि यह उन मामलों में से एक है जहां सामान्य! = इष्टतम, जैसे sudo suया cat file | grep foo
terdon

22

आप सोलारिस का उपयोग करके एक बड़ी फाइल बना सकते हैं:

mkfile 10g /path/to/file

एक और तरीका जो सोलारिस (और लिनक्स) पर काम करता है:

truncate -s 10g /path/to file

इसका उपयोग करना भी संभव है:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240

dd एक टेराबाइट की तरह है
123

1
"एक बड़ी फ़ाइल" को परिभाषित करें :-) लेकिन मैंने अन्य नमूनों के बाद से सभी 10g राज्य को संपादित किया ...
लैम्बर्ट

truncate 'truncate' निष्पादित नहीं कर सकता। ऐसी कोई फ़ाइल या निर्देशिका Truncate केवल Linux नहीं लगती है।
विद्वान

truncateसोलारिस 11.2+ पर मौजूद है
लैम्बर्ट

11

लिनक्स सिस्टम में एक बड़ी फ़ाइल बनाने का सबसे तेज़ तरीका है fallocate:

sudo fallocate -l 2G bigfile

fallocateफाइल सिस्टम में हेरफेर करता है, और वास्तव में डिफ़ॉल्ट रूप से डेटा सेक्टरों को नहीं लिखता है, और जैसे कि बहुत तेज है। नकारात्मक पक्ष यह है कि इसे जड़ के रूप में चलाना होगा।

इसे एक लूप में क्रमिक रूप से चलाना, आप सेकंड के एक मामले में सबसे बड़ी फाइल सिस्टम भर सकते हैं।

से man fallocate

किसी फाइल के लिए आवंटित डिस्क स्थान में हेरफेर करने के लिए, या तो उसे हटाने या प्रचार करने के लिए एरोकेट का उपयोग किया जाता है।
फाइलसिस्टम के लिए जो फालोकेट सिस्टम कॉल का समर्थन करते हैं, प्रीकोलोकेशन को ब्लॉक को आवंटित करके और उन्हें एकरहित के रूप में चिह्नित किया जाता है, जिसके लिए डेटा ब्लॉक में कोई IO की आवश्यकता नहीं होती है। यह एक फ़ाइल को शून्य से भरकर बनाने की तुलना में बहुत तेज़ है।
XFS (लिनक्स 2.6.38 से) के लिए समर्थित, ext4 (लिनक्स 3.0 के बाद से), Btrfs (लिनक्स 3.7 के बाद से) और tmpfs (लिनक्स 3.5 के बाद से)।


1
यह स्वीकृत उत्तर होना चाहिए। आसान और तेज।
ardochhigh

8

यह तब तक चलता रहेगा जब तक आप CTRL-C:

yes This is stuff that I want to put into my file... >> dummy.txt

हालांकि सावधान रहें, क्योंकि आप सैकड़ों हजारों लाइनें / सेकंड प्राप्त कर सकते हैं ...

से man yes:

yes - output a string repeatedly until killed

लिनक्स के वातावरण में एक बड़ी फ़ाइल बनाने के लिए यह एक बहुत ही आसान तरीका है।
चामिंडा बंडारा

1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txtआपको सटीक राशि प्राप्त होगी। (-n $ TARGET_NUMBER_OF_LINES)। yesस्वचालित रूप से एक 'टूटी हुई पाइप' के परिणाम के रूप में मर जाएगा जब headसमाप्त होता है क्योंकि लक्ष्य संख्या तक पहुँच गया है।
PypeBros

4

अगर मैं तुम्हें सही ढंग से समझूं, तो तुम कुछ ऐसा चाह रहे हो:

echo "test line" > file;
for i in {1..21}; do echo "test line" >> file; done

वह "परीक्षण पंक्ति" के 22 दोहराव के साथ एक फ़ाइल बनाएगा। यदि आप एक विशिष्ट फ़ाइल आकार चाहते हैं, तो आप कुछ इस तरह (लिनक्स पर) उपयोग कर सकते हैं। 1024 एक किलोबाइट है:

while [ $(stat -c "%s" file) -le 1024 ]; do echo "test line" >> file; done

व्यक्तिगत रूप से, जब मैं एक बड़ी फ़ाइल बनाना चाहता हूं, तो मैं दो फ़ाइलों का उपयोग करता हूं और एक को दूसरे में रखता हूं। आप वांछित आकार तक पहुंचने तक प्रक्रिया दोहरा सकते हैं (यहां 1MB):

echo "test line" > file;
while [ $(stat -c "%s" file) -le 1048576 ]; do 
    cat file >> newfile
    cat newfile >> file
done

ध्यान दें कि यह समाधान अक्सर वांछित आकार से अधिक हो जाएगा क्योंकि यदि फ़ाइल सीमा के तहत है, तो सब कुछ फिर से इसमें catted हो जाएगा।

अंत में, यदि आप चाहते हैं कि सभी वांछित आकार की एक फ़ाइल है और वास्तव में कुछ भी करने की आवश्यकता नहीं है, तो आप उपयोग करते हैं truncate:

truncate -s 1M file

1
क्या catवास्तव में फ़ाइल का कोई फायदा नहीं है, हालांकि सिर्फ आकर्षक है? ऐसा लगता है जैसे यह अधिक समय लेगा क्योंकि इसमें प्रत्येक लूप को दो प्रक्रियाओं को कांटा जाता है और पूरी सामग्री को कई बार स्थानांतरित करता है।
123

1
@ 123 गति। catदृष्टिकोण बहुत, बहुत तेजी से है। यह केवल विशाल फाइल बनाने के लिए समझ में आता है, लेकिन इसने मेरी मशीन पर 10 सेकंड में 545M फाइल बनाई। समान whileलूप के साथ echo "test line" >> fileसमान समय में 96K फ़ाइल बनाई गई।
terdon

मुझे लगता है कि "बिल्ली" दृष्टिकोण के साथ बात यह है कि यह तेजी से बढ़ता है। दूसरा पुनरावृत्ति शुरू करने पर, 'newfile' में पहले से ही 1 पंक्ति और 'file' में 2 हैं, और जब यह किया जाता है, तो 'newfile' में अब 3 पंक्तियाँ और 'file' है 5. अगला, 'newfile' 8 और 'होगा' फ़ाइल
'13

डाउनसाइड: यह फ़ाइल बनाते समय लक्ष्य फ़ाइल आकार की तुलना में अधिक डिस्क स्थान (> = 1.5 * वांछित_ आकार) ले सकता है।
PypeBros

btw। यदि आपके पास truncateहै, तो आप truncate -s 1Gपहले स्थान पर फ़ाइल बना सकते हैं । unix.stackexchange.com/a/269184/85549 । आप इसे head -c $DESIRED_SIZEसंभवतः whileलूप के भीतर बदल सकते हैं ।
PypeBros

3

की सामग्री को पाइप के द्वारा /dev/urandomकरने के लिएhead आप एक फाइल करने के लिए उत्पादन अनुप्रेषित कर सकते हैं, तो:

 cat /dev/urandom | head --bytes=100 >> foo.bar

आपको 100 बाइट कचरे वाली एक फाइल देगा।


1
echo "This is just a sample line appended  to create a big file. " > dummy.txt
i=1
while [ $i -le 21 ]
do
  cat dummy.txt >> bigfile
  cat bigfile > dummy.txt
  (( i++ ))
done

आपकी विंडोज़ स्क्रिप्ट का एक ही प्रभाव, लेकिन बाश में, आप सीधे, सीधे किसी फ़ाइल को नहीं ले सकते।


.txtएक्सटेंशन को भूलने के अलावा , आप अंत में 2 बड़ी फाइलें छोड़ रहे हैं।
ott--
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.