Bagaimana saya bisa membuat file dengan ukuran tertentu dari baris perintah?

125

Bagaimana saya bisa membuat file (mis. Menggunakan touchperintah atau cara serupa lainnya), tetapi dengan ukuran tertentu (mis. 14 MB)?

Kasus penggunaan adalah untuk menguji FTP dengan berbagai ukuran file. Jika kita dapat membuat file dengan ukuran tertentu, akan berguna untuk memverifikasi transfer FTP, dll.

fasil
sumber
9
Pertanyaan SO terkait: stackoverflow.com/questions/257844/…
Der Hochstapler

Jawaban:

158

Gunakan truncate:

truncate -s 14M filename

Dari 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

Catatan: truncatemungkin tidak tersedia di sistem Anda, misalnya pada Mac OS X itu tidak diinstal secara default (tetapi Anda dapat dengan mudah menginstalnya, menggunakan macports misalnya). Dalam kasus ini, Anda mungkin perlu menggunakan ddatau headsebagai gantinya.

Ashutosh Vishwa Bandhu
sumber
2
Wow. sangat bagus, saya tidak tahu ini.
n611x007
pria mengatakan itu semua: truncate - menyusutkan atau memperluas ukuran file ke ukuran yang ditentukan
ssedano
12
Memang sangat bagus. The touchtidak diperlukan meskipun, Anda hanya dapat menjalankan truncate -s 14M filenameitu akan menciptakan filenamelangsung.
terdon
keren ... inilah yang sebenarnya saya cari ... terima kasih @ oliver-salzburg
fasil
34
Ini sepertinya membuat file jarang , sedangkan jawaban di bawah ini (yang menggunakan "dd") tidak. Saya tidak tahu apakah perbedaan itu penting bagi Anda, tetapi saya pikir saya akan menunjukkannya
offby1
100

EDIT: Cara termudah adalah mungkin truncatedari Ashutosh Vishwa Bandhu ini jawaban , tapi seperti yang ditunjukkan oleh @ offby1 yang menciptakan file jarang yang mungkin tidak apa yang Anda inginkan. Solusi di bawah ini membuat file normal dan penuh.


Perintah berikut membuat file 14MB bernama foo:

  1. fallocate(terima kasih kepada @Breakthrough yang menyarankannya dalam komentar dan memberikan suara untuk jawaban Ahmed Masud di bawah ini yang juga menyebutkannya.)

    fallocate -l 14000000 foo
    

    Perintah ini sangat mengesankan karena secepat truncate(sesaat) terlepas dari ukuran file yang diinginkan (tidak seperti solusi lain yang akan lambat untuk file besar) dan membuat file normal, bukan yang jarang:

    $ 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. Buat file yang diisi dengan data acak

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

                                                                              atau

    head -c 14MB /dev/urandom > foo
    
  3. Buat file yang diisi dengan \0s:

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

                                                                              atau

    head -c 14MB /dev/zero > foo
    
  4. Buat file yang diisi dengan 14MB data pertama dari file lain:

    head -c 14MB bar.txt > foo
    
  5. Buat file yang diisi dengan 14MB data terakhir dari file lain:

    tail -c 14MB bar.txt > foo
    

Dalam semua contoh di atas, file tersebut akan menjadi 14*1000*1000jika Anda inginkan 14*1024*1024, ganti MBdengan M. Sebagai contoh:

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

fallocate hanya berurusan dengan byte, jadi Anda harus melakukan (14 * 1024 * 1024 = 14680064)

fallocate -l 14680064 foo
terdon
sumber
2
Terima kasih ... Ini juga akan memenuhi tujuan saya membuat file dengan ukuran yang diinginkan ...
fasil
2
Saya akan merekomendasikan menentang penggunaan ddjika ada pendekatan yang lebih sederhana, kurang berpotensi merusak.
acolyte
3
@acolyte saya juga. Itu sebabnya setiap ddsolusi memiliki alternatif non-dd.
terdon
1
Entri wiki mengatakan selain dd (dengan nol) akan membuat file jarang, bukan? en.wikipedia.org/wiki/Sparse_file
Michael
1
@Michael saya periksa, hanya untuk memastikan, dan tidak ada perintah saya menghasilkan file jarang. The ddperintah pada halaman wiki benar-benar berbeda dan tidak menggunakan /dev/zero. Adapun apakah Matau MBlebih logis, lakukan dengan pengembang. Halaman manual head , tail dan dd semuanya dengan jelas menyatakan bahwa "MB = 1000 * 1000, M = 1024 * 1024". Ini mungkin berbeda pada * nixes lain.
terdon
21
dd bs=1MB count=14 if=/dev/zero of=<yourfilename>

PERINGATAN dd akan secara diam-diam menimpa apa pun yang Anda punya hak untuk menulis, jika Anda menentukannya secara sukarela atau tidak sengaja. Pastikan Anda mengerti dd, misalnya. dengan membaca dd --help, dan Anda tidak mengacaukan baris perintah dd Anda atau Anda dapat dengan mudah membuat kehilangan data yang ireversibel - bahkan total .

Untuk memulai, if=adalah file input dan of=adalah file output . Selalu periksa kembali apakah Anda sudah benar, sebelum menjalankan perintah. :)

n611x007
sumber
13

Gunakan sihir dd;) halaman manual

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

menyebabkan 14MB * 1024 = 14336KB, atau:

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

Dan Anda akan mendapatkan file output.dat 14mb, diisi dengan nol: D

mirkobrankovic
sumber
8

Ini harus menjadi cara tercepat untuk melakukannya:

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

Kalau tidak, cukup tuliskan program C atau perl cepat dan kotor yang melakukan pencarian ke posisi yang tepat dan menulis satu byte. Ini BANYAK lebih cepat daripada benar-benar membuang data ke blok.

Jika Anda ingin menghindari file jarang kemudian di Linux (dan sistem mungkin lainnya) Anda dapat menggunakan fallocate -l <length>dari util-linux.

Jika itu tidak tersedia, dan Anda memiliki sistem yang sesuai dengan POSIX maka Anda dapat menulis program yang cepat dan kotor menggunakan panggilan pustaka posix_fallocate (). posix_fallocate menjamin alokasi rentang yang ditentukan sehingga Anda tidak akan mendapatkan disk-penuh tentang penggunaan selanjutnya dari rentang jika berhasil kembali

Ahmed Masud
sumber
6

Meskipun ddcara portabel untuk melakukannya, perintah mkfiledan xfs_mkfileditulis khusus untuk tujuan ini dan lebih cepat:

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

Tangkapannya adalah bahwa tidak ada perintah yang tersedia secara universal, sehingga tidak baik untuk menulis skrip portabel. Namun, jika saya melakukannya secara interaktif melalui baris perintah, itu adalah perintah yang saya gunakan.

Secara default mereka membuat file tanpa isi dan file jarang (atau "berlubang") . Mereka berdua mengambil -nopsi untuk membuat file yang jarang.

Pro tua
sumber
1

Ada opsi lain dengan Perl:

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

Ini akan membuat file 1KB. Ganti 1024 dengan nomor yang Anda suka.

Majid Azimi
sumber