लिनक्स में दिए गए आकार के साथ फाइल कैसे बनाएं?


157

परीक्षण उद्देश्यों के लिए मुझे एक निश्चित आकार की एक फ़ाइल (एक अपलोड सीमा का परीक्षण करने के लिए) उत्पन्न करनी होगी।

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


जवाबों:


187
dd if=/dev/zero of=upload_test bs=file_size count=1

file_sizeबाइट्स में आपकी परीक्षण फ़ाइल का आकार कहां है


ओह, यह मेरे दृष्टिकोण से अधिक कुशल हो सकता है क्योंकि यह सब एक ब्लॉक में करता है। अच्छा विचार।
पॉल टॉम्बलिन

10
वास्तव में, एक बहुत बड़ा ब्लॉक का उपयोग करने से यह बहुत खराब हो जाएगा, क्योंकि यह बहुत बड़ा हो जाता है, क्योंकि यह लिखने से पहले मेमोरी में उस राशि को आवंटित करेगा और पढ़ेगा। अगर यह bs = 4GiB जैसा सोमेथिग है, तो आप संभवतः स्वैपिंग समाप्त कर देंगे।
ब्रायन

35
ddइसके मूल्यों के लिए 2 ^ 32 की सीमा है, इसलिए 4 जीबी से बड़ी फ़ाइल बनाने के लिए, एक चाल है dd if=/dev/zero of=test bs=1M count=<size in megabytes>:।
दिमित्रो सिरेंको

2
बेहतर, तेज दृष्टिकोण के लिए अगला उत्तर देखें
सुरुचिपूर्ण डाइस

2
@elegantdice यह स्पष्ट नहीं है कि अगला कौन सा उत्तर है, वे अपनी स्थिति बदल सकते हैं
vladkras

160

कृपया, आधुनिक आसान और तेज है। लिनक्स पर, (एक चुनें)

truncate -s 10G foo
fallocate -l 5G bar

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

यह व्यवहार संभवतः भिन्न हो सकता है - किसी भी मानक या विनिर्देश के लिए उपयोग की गई फ़ाइल प्रणाली और उस फ़ाइल सिस्टम के अनुरूप होने पर निर्भर करता है। इसलिए यह सलाह दी जाती है कि उचित विधि का उपयोग करने के लिए उचित शोध किया जाए।


मैंने कोशिश की truncate। इसके ऊपर के सिंटैक्स का उपयोग करके एक शून्य-आकार की फ़ाइल का उत्पादन किया गया। 'मैन पेज' का fallocateकहना है कि इसके द्वारा बनाई गई फाइलें spaceडेटा के बजाय खाली हैं । ऐसा प्रतीत होता है कि यह कुछ अपेक्षित मामलों के लिए उपयोगी नहीं होगा जैसे "1G फ़ाइल को कॉपी करने में कितना समय लगता है"।
मार्क स्टोसबर्ग

6
मेरे लिए काम ठीक लगता है। यह एक फ़ाइल को सही आकार बनाता है।
एटर सुलेमान

5
यह इस सवाल का सबसे अच्छा जवाब है। ट्रंकट / फॉलोकेट में लंबा समय नहीं लगता है, क्योंकि यह फाइल के सभी ब्लॉक नहीं लिखता है। लेकिन, यदि आप परिणामी फाइल को कहीं अपलोड करना चाहते हैं, तो यह पूरी बात के लिए शून्य पढ़ेगा।
माइक एंड्रयूज

4
यदि आप इसे OSX के तहत चलाना चाहते हैं, तो आपको यह करने की आवश्यकता होगी brew install coreutils:। यह कमांड के सामने एक g जोड़ देगा , इसलिए आपको इसे इस तरह चलाना होगा gtruncate -s 10G foo:। उम्मीद है की यह मदद करेगा!
डेरेक डे

ऐसा लगता है कि यह NTFSविभाजन पर काम नहीं करता है ।
eloyesp

40

बस टॉम की पोस्ट का पालन ​​करने के लिए , आप स्पार्स फ़ाइलों को बनाने के लिए dd का उपयोग कर सकते हैं:

dd if=/dev/zero of=the_file bs=1 count=0 seek=12345

यह अधिकांश यूनिक्स पर एक "छेद" के साथ एक फ़ाइल बनाएगा - डेटा वास्तव में डिस्क पर नहीं लिखा जाएगा, या किसी भी स्थान को तब तक उठाएगा जब तक कि शून्य के अलावा कुछ और इसमें लिखा न जाए।


गिनती सेट करना = फ़ाइल आकार से एक बाइट को घटाना करने से बचा जाता है।
andrewdotn

3
के साथ count=0, bs * seekफ़ाइल का आकार बन जाता है
Jayen

24

OSX (और सोलारिस, जाहिरा तौर पर) पर, mkfileकमांड उपलब्ध है:

mkfile 10g big_file

यह एक 10 जीबी फ़ाइल बनाता है जिसका नाम "big_file" है। यह दृष्टिकोण यहां मिला


यह OS X जैसी स्थितियों के लिए उपयोगी है जहां कमांड truncateऔर fallocateकमांड उपलब्ध नहीं हैं। ddयह भी ऊपर वर्णित के रूप में काम करता है, हालांकि यह mमेगाबाइट के लिए है, नहीं M
user535673

गलत: यह 10 GiB फाइल (= ~ 10,7 GB) बनाता है ।
मिठाई

20

इस कमांड का उपयोग करें:

dd if = $ INPUT-FILE = $ OUTPUT-FILE bs = $ BLOCK-SIZE काउंट = $ NUM-BLOCKS

एक बड़ी (खाली) फ़ाइल बनाने के लिए, सेट करें $INPUT-FILE=/dev/zero
फ़ाइल का कुल आकार होगा $BLOCK-SIZE * $NUM-BLOCKS
बनाई गई नई फाइल होगी $OUTPUT-FILE


आपने सवाल क्यों पूछा?
हेनरी बी

9
मुझे उत्तर के लिए Google के पास था, इसलिए मैंने इसे यहां रखा, इसलिए इस पर चर्चा की जा सकती है और अद्यतित रखी जा सकती है ... आप जानते हैं, पूरी साइट का बिंदु?
ग्रंडलेफलेक

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

3
धन्यवाद पॉल। हालाँकि मैं अंकों के बारे में इतना परेशान नहीं हूँ, लेकिन मैं उन चीजों के बारे में परेशान हूँ, जो मुझे Google पर मिलती हैं, जो किसी तरह से त्रुटिपूर्ण हो सकती हैं, जब तक मैं यहाँ नहीं पूछूँगा, तब तक मुझे इस बारे में कभी पता नहीं चलेगा। लोगों को मेरे क्यू / ए समुदाय के स्वामित्व के लिए स्वतंत्र महसूस करना चाहिए अगर उन्हें लगता है कि मैं वेश्या, श्रग हूं ।
ग्रेंडलेफलेक

2
Faq से उद्धृत करने के लिए "अपने स्वयं के प्रोग्रामिंग सवाल पूछने और जवाब देने के लिए यह भी पूरी तरह से ठीक है, लेकिन आप का नाटक कर रहे हैं खतरे में: एक सवाल के रूप में वाक्यांश।"
क्रेग एंगस

17

आप इसे प्रोग्रामेटिक रूप से कर सकते हैं:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main() {
    int fd = creat("/tmp/foo.txt", 0644);
    ftruncate(fd, SIZE_IN_BYTES);
    close(fd);
    return 0;
}

यह दृष्टिकोण विशेष रूप से फ़ाइल को मेमोरी में mmap करने के लिए उपयोगी है ।

फ़ाइल को सही आकार देने के लिए निम्न कमांड का उपयोग करें:

# du -B1 --apparent-size /tmp/foo.txt

सावधान रहे:

# du /tmp/foo.txt

शायद 0 को प्रिंट करेगा क्योंकि यह आपके फ़ाइल सिस्टम द्वारा समर्थित होने पर स्पार्स फ़ाइल के रूप में आवंटित किया गया है।

यह भी देखें: आदमी 2 खुला और आदमी 2 छोटा


10

तुम यह कर सकते थे:

[dsm@localhost:~]$ perl -e 'print "\0" x 100' > filename.ext

जहां आप 100 बाइट्स की संख्या को बदलना चाहते हैं जो आप लिखी हैं।


और वास्तविक भरने बाइट भी। मुझे "\ xff" की आवश्यकता है और ठीक काम करता है। धन्यवाद! :)
रे

10

इनमें से कुछ उत्तर आपने /dev/zeroअपने डेटा के स्रोत के लिए उपयोग किए हैं। यदि आपके परीक्षण नेटवर्क ने गति अपलोड की है, तो यह सबसे अच्छा विचार नहीं हो सकता है यदि आपका एप्लिकेशन कोई संपीड़न कर रहा है, तो जीरो कम्प्रेस से भरी फ़ाइल वास्तव में अच्छी तरह से संपीड़ित होती है । फ़ाइल बनाने के लिए इस कमांड का उपयोग करना

 dd if=/dev/zero of=upload_test bs=10000 count=1

मैं upload_testलगभग 200 बाइट्स को कम कर सकता था । तो आप अपने आप को ऐसी स्थिति में डाल सकते हैं जहाँ आपको लगता है कि आपकी अपलोडिंग 10KB फाइल है लेकिन यह वास्तव में बहुत कम होगी।

मेरा सुझाव है कि /dev/urandomइसके बजाय का उपयोग कर रहा है /dev/zero। मैं /dev/urandomबहुत अधिक के आउटपुट को संपीड़ित नहीं कर सका ।


मेरा एम्बेडेड सिस्टम नहीं है /dev/zero, इसलिए /dev/urandomअच्छा है।
फ्रेडरिक गॉस ने


4

बहुत सारे उत्तर हैं, लेकिन किसी ने भी अच्छी तरह से नहीं समझाया कि और क्या किया जा सकता है। Dd के लिए मैन पेजों को देखते हुए , फ़ाइल के आकार को बेहतर ढंग से निर्दिष्ट करना संभव है।

यह शून्य से भरा /tmp/zero_big_data_file.bin बनाने जा रहा है, जिसका आकार 20 मेगाबाइट है:

    dd if=/dev/zero of=/tmp/zero_big_data_file.bin  bs=1M count=20

यह शून्य से भरा /tmp/zero_1000bytes_data_file.bin बनाने जा रहा है, जिसका आकार 1000 बाइट्स है:

    dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1kB count=1

या

    dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1000 count=1

  • सभी उदाहरणों में, बी एस ब्लॉक आकार है, और गणना ब्लॉक की संख्या है
  • निम्नलिखित गुणात्मक प्रत्ययों द्वारा BLOCKS और BYTES का अनुसरण किया जा सकता है: c = 1, w = 2, b = 512, kB = 1000, K = 1024, MB = 1000 * 1000, M = 1024 * 1024, xM = GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024, और इतने पर T, P, E, Z, Y के लिए।


3

यह वर्तमान निर्देशिका में यादृच्छिक पात्रों के साथ 4 एमबी पाठ फ़ाइल उत्पन्न करेगा और इसका नाम "4mb.txt" आप विभिन्न आकारों और नामों को उत्पन्न करने के लिए पैरामीटर बदल सकते हैं।

base64 /dev/urandom | head -c 4000000 > 4mb.txt

0

fallocateयदि आप डिस्क के लिए इंतजार नहीं करना चाहते हैं तो उपयोग करें ।

उदाहरण:

fallocate -l 100G BigFile

उपयोग:

Usage:
 fallocate [options] <filename>

Preallocate space to, or deallocate space from a file.

Options:
 -c, --collapse-range remove a range from the file
 -d, --dig-holes      detect zeroes and replace with holes
 -i, --insert-range   insert a hole at range, shifting existing data
 -l, --length <num>   length for range operations, in bytes
 -n, --keep-size      maintain the apparent size of the file
 -o, --offset <num>   offset for range operations, in bytes
 -p, --punch-hole     replace a range with a hole (implies -n)
 -z, --zero-range     zero and ensure allocation of a range
 -x, --posix          use posix_fallocate(3) instead of fallocate(2)
 -v, --verbose        verbose mode

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