Bagaimana cara membuat file dengan ukuran tertentu di Linux?

157

Untuk tujuan pengujian, saya harus membuat file dengan ukuran tertentu (untuk menguji batas unggahan).

Apa perintah untuk membuat file dengan ukuran tertentu di Linux?

Grundlefleck
sumber
stackoverflow.com/questions/257844/…
Ciro Santilli 郝海东 冠状 病 六四 六四 事件

Jawaban:

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

Di mana file_sizeukuran file uji Anda dalam byte

Ilya Kochetov
sumber
Oh, itu mungkin lebih efisien daripada pendekatan saya karena itu melakukan semuanya dalam satu blok. Ide bagus.
Paul Tomblin
10
Sebenarnya, menggunakan blocksize besar akan jauh lebih buruk setelah menjadi sangat besar, karena akan mengalokasikan dan membaca jumlah itu ke dalam memori sebelum menulis. Jika ini mirip dengan bs = 4GiB Anda mungkin akan berakhir bertukar.
Brian
35
ddmemiliki batas 2 ^ 32 untuk nilai-nilai, sehingga untuk membuat file lebih besar dari 4 GB, ada trik: dd if=/dev/zero of=test bs=1M count=<size in megabytes>.
Dmytro Sirenko
2
Lihat jawaban berikutnya untuk pendekatan yang lebih baik, lebih cepat
dadu elegan
2
@elegantdice tidak jelas jawaban mana yang berikutnya, mereka dapat mengubah posisi mereka
vladkras
160

Tolong, modern lebih mudah, dan lebih cepat. Di Linux, (pilih satu)

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

Ini perlu untuk dinyatakan bahwa truncatepada sistem file mendukung file jarang akan membuat file jarang dan fallocatetidak akan. Sebuah file jarang adalah salah satu di mana unit alokasi yang membentuk file tidak benar-benar dialokasikan sampai digunakan. Namun, meta-data untuk file tersebut akan memakan ruang yang cukup besar tetapi kemungkinan tidak ada di dekat ukuran sebenarnya file tersebut. Anda harus berkonsultasi dengan sumber daya tentang file jarang untuk informasi lebih lanjut karena ada kelebihan dan kekurangan untuk jenis file ini. File non-sparse memiliki blok (unit alokasi) yang dialokasikan sebelumnya yang berarti ruang disediakan sejauh sistem file melihatnya. Juga fallocatetidak truncateakan mengatur konten file ke nilai yang ditentukan seperti dd, alih-alih isi file yang dialokasikan dengan fallocateatau truncatemungkin nilai sampah apa pun yang ada di unit yang dialokasikan selama pembuatan dan perilaku ini mungkin atau mungkin tidak diinginkan. Ini ddadalah yang paling lambat karena itu benar-benar menulis nilai atau potongan data ke seluruh aliran file seperti yang ditentukan dengan opsi baris perintah itu.

Perilaku ini berpotensi berbeda - tergantung pada sistem file yang digunakan dan kesesuaian sistem file tersebut dengan standar atau spesifikasi apa pun. Oleh karena itu disarankan agar penelitian yang tepat dilakukan untuk memastikan bahwa metode yang tepat digunakan.

jørgensen
sumber
Saya mencoba truncate. Ini menghasilkan file berukuran nol menggunakan sintaks di atas. 'Halaman manual' untuk fallocatemengatakan bahwa file yang dibuatnya penuh dengan kosong spacedaripada data. Tampaknya itu tidak akan berguna untuk beberapa kasus yang diharapkan seperti "berapa lama waktu yang dibutuhkan untuk menyalin file 1G".
Mark Stosberg
6
fallocate tampaknya bekerja dengan baik untuk saya. Itu menciptakan file dengan ukuran yang tepat.
Aater Suleman
5
Ini adalah jawaban terbaik untuk pertanyaan ini. Truncate / fallocate tidak butuh waktu lama, karena tidak menulis semua blok file. Tetapi, jika Anda kemudian mengunggah file yang dihasilkan di suatu tempat, itu akan membaca nol untuk semuanya.
Mike Andrews
4
Jika Anda ingin menjalankan ini di bawah OSX, maka Anda akan perlu melakukan ini: brew install coreutils. Ini akan menambah g di depan perintah, sehingga Anda harus menjalankannya seperti ini: gtruncate -s 10G foo. Semoga ini membantu!
DerekE
Tampaknya itu tidak berfungsi pada NTFSpartisi.
eloyesp
40

Hanya untuk menindaklanjuti posting Tom , Anda dapat menggunakan dd untuk membuat file jarang juga:

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

Ini akan membuat file dengan "lubang" di dalamnya pada sebagian besar unix - data tidak akan benar-benar ditulis ke disk, atau mengambil ruang apa pun sampai sesuatu selain nol ditulis ke dalamnya.

Brian
sumber
Pengaturan count = 0 menghindari harus mengurangi byte dari ukuran file.
andrewdotn
3
dengan count=0, bs * seekmenjadi ukuran file
Jayen
24

Pada OSX (dan Solaris, tampaknya), mkfileperintah juga tersedia:

mkfile 10g big_file

Ini membuat file 10 GB bernama "big_file". Menemukan pendekatan ini di sini.

steve
sumber
Ini berguna untuk situasi seperti OS X di mana perintah truncatedan fallocatetidak tersedia. ddjuga berfungsi seperti dijelaskan di atas meskipun muntuk megabyte, tidak M.
user535673
Salah: Ini menciptakan file 10 GiB (= ~ 10,7 GB).
hidangan penutup
20

Gunakan perintah ini:

dd if = $ INPUT-FILE dari = $ OUTPUT-FILE bs = $ BLOCK-SIZE count = $ NUM-BLOCKS

Untuk membuat file besar (kosong), atur $INPUT-FILE=/dev/zero.
Ukuran total file akan menjadi $BLOCK-SIZE * $NUM-BLOCKS.
File baru akan dibuat $OUTPUT-FILE.

Grundlefleck
sumber
Mengapa Anda mengajukan pertanyaan?
Henry B
9
Saya harus ke Google untuk jawabannya, jadi saya taruh di sini, sehingga bisa didiskusikan dan diperbarui ... Anda tahu, maksud dari seluruh situs?
Grundlefleck
2
Saya tahu orang-orang memilih @Grundlefleck untuk pelacur XP, tapi dia ada benarnya - salah satu cara untuk menggunakan situs ini seperti yang dibayangkan oleh Jeff dan Joel adalah dengan mengajukan pertanyaan dan jawaban untuk sesuatu yang baru saja Anda temukan.
Paul Tomblin
3
Terima kasih Paul. Meskipun saya tidak begitu peduli tentang poin, saya terganggu tentang hal-hal yang saya temukan di Google yang mungkin cacat dalam beberapa hal yang tidak akan pernah saya ketahui kecuali saya bertanya di sini. Orang-orang harus merasa bebas untuk membuat komunitas Tanya Jawab milik saya jika mereka pikir saya pelacur, mengangkat bahu .
Grundlefleck
2
Mengutip dari faq's "Tidak apa-apa untuk bertanya dan menjawab pertanyaan pemrograman Anda sendiri, tetapi berpura-puralah Anda menggunakan Jeopardy: frasa itu dalam bentuk pertanyaan."
Craig Angus
17

Anda dapat melakukannya secara terprogram:

#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;
}

Pendekatan ini sangat berguna untuk kemudian mmap file ke dalam memori.

gunakan perintah berikut untuk memeriksa apakah file memiliki ukuran yang benar:

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

Hati-hati:

# du /tmp/foo.txt

mungkin akan mencetak 0 karena dialokasikan sebagai file Jarang jika didukung oleh sistem file Anda.

lihat juga: man 2 open dan man 2 truncate

Benedikt Waldvogel
sumber
10

Anda bisa melakukan:

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

Di mana Anda mengganti 100 dengan jumlah byte yang ingin Anda tulis.

dsm
sumber
Dan byte pengisian yang sebenarnya juga. Saya perlu "\ xff" dan berfungsi dengan baik. Terima kasih! :)
Ray
10

Beberapa jawaban ini telah Anda gunakan /dev/zerountuk sumber data Anda. Jika kecepatan pengujian jaringan pengujian Anda, ini mungkin bukan ide terbaik jika aplikasi Anda melakukan kompresi apa pun, file yang penuh dengan nol kompres dengan sangat baik. Menggunakan perintah ini untuk menghasilkan file

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

Saya dapat memampatkan upload_testhingga sekitar 200 byte. Jadi Anda bisa menempatkan diri Anda dalam situasi di mana Anda pikir Anda mengunggah file 10KB tetapi sebenarnya akan jauh lebih sedikit.

Apa yang saya sarankan adalah menggunakan /dev/urandombukan /dev/zero. Saya tidak bisa memampatkan output /dev/urandomsangat banyak sekali.

devin
sumber
Sistem embedded saya tidak punya /dev/zero, jadi /dev/urandombagus.
Fredrick Gauss
9
dd if=/dev/zero of=my_file.txt count=12345
Paul Tomblin
sumber
4
Ingat bahwa ukuran blok default dd adalah 512 byte, jadi perintah ini akan membuat file berukuran 12345 * 512 byte.
tidak ada yang
4

Ada banyak jawaban, tetapi tidak ada yang menjelaskan dengan baik apa lagi yang bisa dilakukan. Melihat ke halaman manual untuk dd , dimungkinkan untuk lebih menentukan ukuran file.

Ini akan membuat /tmp/zero_big_data_file.bin diisi dengan nol, yang memiliki ukuran 20 megabyte:

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

Ini akan membuat /tmp/zero_1000bytes_data_file.bin diisi dengan nol, yang memiliki ukuran 1000 byte:

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

atau

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

  • Dalam semua contoh, bs adalah ukuran blok, dan jumlah adalah jumlah blok
  • BLOK dan BANTUAN dapat diikuti oleh sufiks multiplikasi berikut: c = 1, w = 2, b = 512, kB = 1000, K = 1024, MB = 1000 * 1000, M = 1024 * 1024, xM = M GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024, dan seterusnya untuk T, P, E, Z, Y.
BЈовић
sumber
3

Sebagai perintah shell:

< /dev/zero head -c 1048576 >  output
pengguna1772090
sumber
3

Ini akan menghasilkan file teks 4 MB dengan karakter acak di direktori saat ini dan namanya "4mb.txt" Anda dapat mengubah parameter untuk menghasilkan berbagai ukuran dan nama.

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

Gunakan fallocatejika Anda tidak ingin menunggu disk.

Contoh:

fallocate -l 100G BigFile

Pemakaian:

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
qin
sumber