سؤال كيف يمكنني إنشاء ملف بحجم معين من سطر الأوامر؟


كيف يمكنني إنشاء ملف (على سبيل المثال استخدام touch أو طريقة أخرى مماثلة) ، ولكن بحجم محدد (مثل 14 ميغابايت)؟

حالة الاستخدام هي اختبار FTP بأحجام ملفات مختلفة. إذا تمكنا من إنشاء ملف بحجم معين ، فسيكون من المفيد التحقق من نقل FTP إلخ.


115
2018-06-18 11:14


الأصل


سؤال SO stackoverflow.com/questions/257844/... - Der Hochstapler


الأجوبة:


استعمال truncate:

truncate -s 14M filename

من عند man truncate:

DESCRIPTION
   Shrink or extend the size of each FILE to the specified size

[...]

 -s, --size=SIZE
          set or adjust the file size by SIZE

ملحوظة: truncate قد لا يكون متاحًا على نظامك ، على سبيل المثال في نظام التشغيل Mac OS X ، لا يتم تثبيته بشكل افتراضي (ولكن يمكنك تثبيته بسهولة ، باستخدام macports على سبيل المثال). في هذه الحالات قد تحتاج إلى استخدام dd أو head في حين أن.


150
2018-06-18 11:26



رائع. جميل جدا ، لم أكن أعرف هذا. - n611x007
رجل يقول كل شيء: اقتطاع - تقليص أو توسيع حجم الملف إلى الحجم المحدد - ssedano
جميل جدا حقا. ال touch ليست هناك حاجة على الرغم من ذلك ، يمكنك ببساطة تشغيل truncate -s 14M filename سوف يخلق filename مباشرة. - terdon
بارد ... هذا هو ما كنت أبحث عنه بالضبط ... شكرا @ أوليفر سالزبورغ - fasil
هذا يبدو لخلق ملف متفرق، في حين أن الإجابة أدناه (التي تستخدم "dd") لا. لا أعرف ما إذا كان الفرق مهم بالنسبة لك ، لكنني كنت أحسب أنني سأشير إلى ذلك - offby1


تحرير: أبسط طريقة هي على الارجح truncate من Ashutosh Vishwa باندو إجابة، ولكن كما أشار @ offby1 هذا يخلق ملفات متفرقه قد لا يكون ما تريد. تعمل الحلول أدناه على إنشاء ملفات عادية كاملة.


الأوامر التالية إنشاء ملف 14 ميغابايت تسمى foo:

  1. fallocate (شكرا ل @اختراق من اقترحها في التعليقات وصوت أحمد مسعود إجابة أدناه والتي يذكرها أيضا.)

    fallocate -l 14000000 foo
    

    هذا الأمر مثير للإعجاب بشكل خاص لأنه سريع truncate (لحظية) بغض النظر عن حجم الملف المطلوب (بخلاف الحلول الأخرى التي ستكون بطيئة للملفات الكبيرة) وبعد ذلك تقوم بإنشاء ملفات عادية ، وليس الملفات المتفرقة:

    $ truncate -s 14MB foo1.txt 
    $ fallocate -l 14000000 foo2.txt 
    $ ls -ls foo?.txt 
        0 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:54 foo1.txt
    13672 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:55 foo2.txt
    
  2. قم بإنشاء ملف مليء بالبيانات العشوائية

    dd if=/dev/urandom of=foo bs=14MB count=1
    

    أو

    head -c 14MB /dev/urandom > foo
    
  3. إنشاء ملف مليء \0الصورة:

    dd if=/dev/zero of=foo.txt bs=14MB count=1
    

    أو

    head -c 14MB /dev/zero > foo
    
  4. إنشاء ملف ممتلئ بأول 14 ميغابايت من البيانات لملف آخر:

    head -c 14MB bar.txt > foo
    
  5. إنشاء ملف تم ملؤه بآخر 14 ميغابايت من البيانات لملف آخر:

    tail -c 14MB bar.txt > foo
    

في جميع الأمثلة المذكورة أعلاه ، سيكون الملف 14*1000*1000 إن أردت 14*1024*1024، يحل محل MB مع M. فمثلا:

dd if=/dev/urandom of=foo bs=14M count=1
head -c 14M /dev/zero > foo

fallocate يتعامل فقط مع وحدات البايت ، لذلك عليك القيام به (14 * 1024 * 1024 = 14680064)

fallocate -l 14680064 foo

96
2018-06-18 11:23



شكرا ... وهذا أيضا تلبية هدفي من إنشاء ملف بالحجم المطلوب ... - fasil
أوصي ضد استخدام dd إذا كان هناك نهج أبسط وأقل احتمالية للتدمير. - acolyte
acolyte لذلك سوف I. هذا هو السبب في كل منهما dd الحل لديه بديل غير DD. - terdon
يقول دخول الويكي حتى من dd (مع الأصفار) سوف يخلق ملف متفرق ، أليس كذلك؟ en.wikipedia.org/wiki/Sparse_file - Michael
Michael لقد تحققت ، فقط للتأكد ، وأيا من الأوامر الخاصة بي تنتج ملفات متفرقة. ال dd أمر على صفحة ويكي مختلفة تماما ولا تستخدم /dev/zero. اما ما اذا M أو MB هو أكثر منطقية ، تناوله مع المطورين. صفحات الرجل من رئيس، ذيل و دد جميع تنص بوضوح أن "MB = 1000 * 1000 ، م = 1024 * 1024". قد يكون هذا مختلفًا على nixes * أخرى. - terdon


dd bs=1MB count=14 if=/dev/zero of=<yourfilename>

تحذير  dd سوف يكتب بصمت اى شى لديك الحق في الكتابة إليها ، إذا حددتها إما عن طيب خاطر أو عن طريق الصدفة. تأكد من أنك تفهم ddعلى سبيل المثال مع القراءة dd --help، وأنت لا تفسد خطوط الأمر dd أو يمكنك بسهولة إنشاء فقدان البيانات لا رجعة فيه - حتى المجموع.

للبداية، if= هل ملف الإدخال و of= هل ملف إلاخراج. دائما تأكد من أنك حصلت على الحق ، قبل تشغيل الأمر. :)


21
2018-06-18 11:23





استخدم السحر dd ؛) صفحة رجل

$ dd if=/dev/zero of=output.dat  bs=1024  count=14336

تسبب 14 ميغابايت * 1024 = 14336 كيلوبايت ، أو:

$ dd if=/dev/zero of=output.dat  bs=1MB  count=14

وسوف تحصل على ملف output.dat 14mb ، مليئة الأصفار: D


13
2018-06-18 11:20





يجب أن تكون هذه أسرع طريقة للقيام بذلك:

SEEK=$SIZE-1
dd if=/dev/zero of=outfile bs=1 seek=$SEEK count=1 

خلاف ذلك مجرد كتابة برنامج C أو بيرل سريع وقذرة يفعل السعي إلى الموقع المحدد ويكتب بايت واحد. هذا هو LOT أسرع من تفريغ البيانات في الواقع على كتل.

إذا كنت ترغب في تجنب الملفات المتفرقة ، فيمكنك استخدام Linux (وربما أنظمة أخرى) fallocate -l <length> من عند util-linux.

إذا لم يكن هذا متاحًا ، وكان لديك نظام متوافق مع POSIX ، فيمكنك كتابة برنامج سريع وقذر باستخدام استدعاء مكتبة posix_fallocate (). يضمن posix_fallocate تخصيص النطاق المحدد بحيث لن تحصل على قرص كامل عند الاستخدام اللاحق للنطاق إذا تمت إعادته بنجاح


8
2018-06-19 04:05





في حين dd هي الطريقة المحمولة للقيام بذلك ، والأوامر mkfile و xfs_mkfile مكتوبة خصيصًا لهذا الغرض وتكون أسرع:

mkfile size[b|k|m|g] filename
xfs_mkfile size[b|k|m|g] filename

ويكمن المصيد في عدم توفر أي من الأوامر على مستوى العالم ، لذلك فهي ليست جيدة لكتابة النصوص البرمجية المحمولة. ومع ذلك ، إذا كنت أفعل ذلك بشكل تفاعلي عبر سطر الأوامر ، فهذه هي الأوامر التي أستخدمها.

بشكل افتراضي يقومون بإنشاء ملفات مملوءة صفر وليس ملفات متفرقة (أو "holey"). كلاهما يأخذ -n خيار لإنشاء ملفات متفرق بدلا من ذلك.


6
2018-06-20 04:59





هناك خيار آخر مع Perl:

perl -e 'print "a" x 1024' > file.txt

هذا سيخلق ملف 1KB. استبدل 1024 بأي رقم تريده.


1
2017-12-11 20:00