Komut satırından belirli boyutta bir dosyayı nasıl oluşturabilirim?


125

Bir dosyayı nasıl oluşturabilirim (örn. touchKomutu veya başka bir şekilde kullanarak ), ancak belirli bir boyuta sahip (örneğin 14 MB)?

Kullanım durumu, FTP'yi çeşitli dosya boyutlarında test etmektir. Belirli bir boyutta bir dosya oluşturabilirsek, FTP aktarımını vb. Doğrulamak yararlı olacaktır.


Yanıtlar:


158

Kullanım truncate:

truncate -s 14M filename

Kimden 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

Not: truncateSisteminizde bulunmayabilir, örneğin Mac OS X'te varsayılan olarak yüklü değildir (ancak, örneğin macport'ları kullanarak kolayca yükleyebilirsiniz). Bu gibi durumlarda ddya da kullanmanız gerekebilir head.


2
vay. çok güzel, bunu bilmiyordum.
n611x007

Adam her şeyi söylüyor: kesmek - bir dosyanın boyutunu küçültmek veya belirtilen boyuta genişletmek
ssedano

12
Gerçekten çok iyi. touchGerçi, sadece çalıştırabilirsiniz gerekli değildir truncate -s 14M filenameonu yaratacaktır filenamedoğrudan.
terdon

harika ... tam olarak aradığım şey buydu ... thanks @ oliver-salzburg
fasil

34
Bu , seyrek bir dosya yaratıyor gibi gözükse de , aşağıdaki cevap ("dd" yi kullanan) değil.
Farkın

100

EDIT: En basit yol muhtemelen truncateAshutosh Vishwa Bandhu'nun cevabıdır , fakat @ offby1 tarafından belirtildiği gibi, istediğiniz gibi olmayan seyrek dosyalar oluşturur . Aşağıdaki çözümler normal, tam dosyalar oluşturur.


Aşağıdaki komutlar adında 14 MB bir dosya oluşturur foo:

  1. fallocate(sayesinde @Breakthrough yorumlarda önerdi kim Ahmed Masud doldu oy cevabını da o bahseder aşağıda.)

    fallocate -l 14000000 foo
    

    Bu komut özellikle etkileyicidir, çünkü truncateistenen dosya boyutuna bakılmaksızın (büyük dosyalar için yavaş olacak diğer çözümlerden farklı olarak) hızlı (anlık) ve nadiren de olsa normal dosyalar oluşturur:

    $ 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. Rasgele verilerle dolu bir dosya oluşturun

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

                                                                              veya

    head -c 14MB /dev/urandom > foo
    
  3. \0S ile dolu bir dosya oluşturun :

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

                                                                              veya

    head -c 14MB /dev/zero > foo
    
  4. Başka bir dosyanın ilk 14 MB'lık verileriyle dolu bir dosya oluşturun:

    head -c 14MB bar.txt > foo
    
  5. Başka bir dosyanın son 14 MB'lık verileriyle dolu bir dosya oluşturun:

    tail -c 14MB bar.txt > foo
    

Yukarıdaki örneklerin hepsinde, 14*1000*1000eğer istersen , dosya ile 14*1024*1024değiştir . Örneğin:MBM

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

fallocate sadece bayt cinsinden fırsatlar, bu yüzden yapmanız gerekenler (14 * 1024 * 1024 = 14680064)

fallocate -l 14680064 foo

2
Teşekkürler ... Bu aynı zamanda istenilen büyüklükte bir dosya oluşturma
amacımı

2
Daha ddbasit, daha az potansiyel yıkıcı bir yaklaşım varsa kullanılmasını tavsiye ederim .
acolyte

3
@kolitik de öyle olur. Bu yüzden her ddçözümün dd dışı bir alternatifi var.
terdon

1
Wiki girişinde gd'nin bile (sıfırlarla) seyrek bir dosya yaratacağı yazıyor, değil mi? en.wikipedia.org/wiki/Sparse_file
Michael,

1
@Michael Sadece emin olmak için kontrol ettim ve komutlarımın hiçbiri seyrek dosyalar üretmiyor. ddWiki sayfasında komut tamamen farklıdır ve kullanmaz /dev/zero. İster gelince Mveya MBdaha mantıklıdır, geliştiricileri ile tartış. Baş , kuyruk ve dd man sayfaları açıkça "MB = 1000 * 1000, M = 1024 * 1024" dür. Bu, diğer * nix'lerde farklı olabilir.
terdon

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

UYARI dd , isteyerek veya kazara belirtirseniz, yazma hakkınız olan her şeyin üzerine sessizce yazacaktır . Anladığından emin ol dd, örneğin. okuma ile dd --helpve dd komut satırlarınızı bozmazsınız ya da geri dönüşü olmayan veri kaybını kolayca oluşturabilirsiniz - toplamda bile .

Başlangıç için, if=bir giriş dosyası ve of=bir çıktı dosyası . Komutu çalıştırmadan önce her zaman doğru yaptığınızı kontrol edin. :)


13

Büyü dd;) man sayfasını kullanın

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

neden 14 MB * 1024 = 14336KB veya:

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

Ve sıfırlarla dolu 14mb output.dat dosyası alacaksınız: D


8

Bunu yapmanın en hızlı yolu bu olmalı:

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

Aksi halde, tam pozisyonu arayan ve tek bayt yazan hızlı ve kirli bir C veya perl programı yazmanız yeterlidir. Bu, aslında veriyi bloklara dökmekten çok daha hızlı.

Eğer seyrek dosyaları kaçınmak istiyorsanız o zaman Linux (ve muhtemelen diğer sistemlerde) üzerine kullanabilirsiniz fallocate -l <length>gelen util-linux.

Bu kullanılamıyorsa ve POSIX uyumlu bir sisteminiz varsa posix_fallocate () kütüphane çağrısını kullanarak hızlı ve kirli bir program yazabilirsiniz. posix_fallocate, belirtilen aralığın tahsis edilmesini garanti eder;


6

Bunu ddyapmak için taşınabilir bir yol olsa da, komutlar mkfileve xfs_mkfileözellikle bu amaç için yazılır ve daha hızlıdır:

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

Buradaki yakalama, hiçbir komutun evrensel olarak mevcut olmamasıdır, bu nedenle taşınabilir komut dosyaları yazmak için iyi değildir. Bununla birlikte, etkileşimli olarak komut satırı üzerinden yapıyorum, bunlar benim kullandığım komutlardır.

Varsayılan olarak sıfır doldurulmuş dosyalar oluşturur ve seyrek (veya "holey") dosyalar oluşturmazlar . Her ikisi de -nbunun yerine seyrek dosyalar oluşturma seçeneğini kullanır.


1

Perl ile başka bir seçenek daha var:

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

Bu 1KB dosyası yaratacaktır. 1024'ü istediğiniz numara ile değiştirin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.