Linux'ta belirli bir boyuta sahip bir dosya nasıl oluşturulur?


Yanıtlar:


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

file_sizeTest dosyanızın bayt cinsinden boyutu nerede


Oh, bu benim yaklaşımımdan daha etkili olabilir, çünkü hepsini tek bir blokta yapar. İyi bir fikir.
Paul Tomblin

10
Aslında, büyük bir blok boyutu kullanmak çok büyük hale geldiğinde çok daha kötü performans gösterecektir, çünkü yazmadan önce bu miktarı hafızaya tahsis edip okuyacaktır. Bu bs = 4GiB gibi bir şeyse, muhtemelen takas edersiniz.
Brian

35
ddböylece 4 GB'tan daha büyük bir dosya oluşturmak için, onun değerler için 2 ^ 32 sınırı vardır, bir numara var: dd if=/dev/zero of=test bs=1M count=<size in megabytes>.
Dmytro Sirenko

2
Daha iyi, daha hızlı bir yaklaşım için bir sonraki cevaba bakın
zarif zar

2
@elegantdice hangi cevabın bir sonraki olacağı belli değil, pozisyonlarını değiştirebilirler
vladkras

160

Lütfen modern daha kolay ve daha hızlı. Linux'ta, (birini seçin)

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

Bu ihtiyacı olduğunu belirtti edilecek truncatebir dosya sistemine destek seyrek dosyalar seyrek dosyası oluşturmak ve edecek fallocateolmayacak. Bir seyrek dosya dosyasını oluşturan ayırma birimleri değil biridir aslında kullanılana kadar tahsis etti. Dosya için meta veri olacaktır ancak bazı önemli alan ancak büyük olasılıkla hiçbir yerde dosyanın gerçek boyutundan yakın sürebilir. Bu tür dosyaların avantajları ve dezavantajları olduğu için daha fazla bilgi için seyrek dosyalar hakkındaki kaynaklara başvurmalısınız. Seyrek olmayan bir dosyanın blokları (ayırma birimleri) önceden tahsis edilir, bu da alanın dosya sistemi gördüğü kadar ayrıldığı anlamına gelir. Ayrıca fallocatene de truncatebelirli bir değere dosyanın içeriğini ayarlamak olmayacak gibi ddbunun yerine, oluşturma sırasında ayrılan bir dosya ile ayrılan fallocateveya truncateherhangi bir çöp kutusu içeriği oluşturulabilir ve bu davranış istenebilir veya istenmeyebilir. Bu dden yavaş olanıdır, çünkü aslında komut satırı seçenekleriyle belirtildiği gibi veri değerini veya yığınını tüm dosya akışına yazar.

Bu davranış potansiyel olarak farklı olabilir - kullanılan dosya sistemine ve bu dosya sisteminin herhangi bir standart veya spesifikasyona uygunluğuna bağlı olarak. Bu nedenle, uygun yöntemin kullanıldığından emin olmak için uygun araştırmaların yapılması tavsiye edilir.


Denedim truncate. Yukarıdaki sözdizimini kullanarak sıfır boyutlu bir dosya oluşturdu. 'Man sayfası', fallocateoluşturduğu dosyaların spaceveri yerine boş dolu olduğunu söylüyor . Görünüşe göre "1G dosyasını kopyalamak ne kadar zaman alır" gibi bazı beklenen durumlar için yararlı olmaz.
Mark Stosberg

6
fallocate benim için iyi çalışıyor gibi görünüyor. Doğru boyutta bir dosya oluşturur.
Aater Suleman

5
Bu sorunun en iyi cevabı bu. Kesilme / yanlış konum uzun sürmez, çünkü dosyanın tüm bloklarını yazmaz. Ancak, sonuçtaki dosyayı bir yere yükleyecekseniz, her şey için sıfırları okurdu.
Mike Andrews

4
Eğer OSX altında bu çalıştırmak istiyorsanız, o zaman bunu yapmak gerekir: brew install coreutils. Bu katacak g komutunun önünde, bu yüzden bu şekilde çalıştırmak zorunda: gtruncate -s 10G foo. Bu yardımcı olur umarım!
DerekE

Görünüşe göre bir NTFSbölüm üzerinde çalışmıyor .
eloyesp

40

Sadece Tom'un gönderisini takip etmek için, seyrek dosyalar oluşturmak için de dd'yi kullanabilirsiniz:

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

Bu, çoğu unix üzerinde içinde bir "delik" bulunan bir dosya oluşturur - veriler aslında diske yazılmaz veya içine sıfır dışında bir şey yazılana kadar herhangi bir yer kaplamaz.


Count = 0 olarak ayarlandığında, dosya boyutundan bir bayt çıkarılması gerekmez.
andrewdotn

3
ile count=0, bs * seekdosya boyutu olur
Jayen

24

OSX'te (ve Solaris'de, görünüşe göre), mkfilekomut da kullanılabilir:

mkfile 10g big_file

Bu, "big_file" adlı 10 GB'lık bir dosya yapar. Bu yaklaşımı burada buldum.


Bu, truncateve fallocatekomutlarının kullanılamadığı OS X gibi durumlar için kullanışlıdır . ddAyrıca mmegabayt için olmasına rağmen yukarıda açıklandığı gibi çalışır M.
user535673

Yanlış: Bu 10 GiB dosyası oluşturur (= ~ 10,7 GB).
tatlı

20

Bu komutu kullanın:

gg if = $ INPUT-FILE / $ $ OUTPUT-FILE bs = $ BLOCK-SIZE sayısı = $ NUM-BLOK

Büyük (boş) bir dosya oluşturmak için ayarlayın $INPUT-FILE=/dev/zero.
Dosyanın toplam boyutu olacaktır $BLOCK-SIZE * $NUM-BLOCKS.
Yeni dosya oluşturulacak $OUTPUT-FILE.


Soruyu neden sordun?
Henry B

9
Cevabım için Google'a gitmem gerekiyordu, bu yüzden buraya koydum, bu yüzden tartışılabilir ve güncel tutulabilir ... bilirsiniz, tüm sitenin amacı?
Grundlefleck

2
İnsanların XP fahişeleri için @Grundlefleck'e oy verdiğini biliyorum, ancak bir amacı var - bu siteyi Jeff ve Joel tarafından tasarlandığı gibi kullanmanın yollarından biri, keşfettiğiniz bir şey için bir soru sormak ve yanıtlamaktır.
Paul Tomblin

3
Teşekkürler Paul. Puanlar hakkında çok fazla endişelenmeme rağmen, Google'da bulduğum ve burada sormadıkça asla öğrenemeyeceğim bir şekilde kusurlu olabilecek şeyler hakkında rahatsızım. İnsanlar, onlar whoring düşünüyorsan benim Q / A topluluk sahibi yapmak için çekinmeyin Poetry .
Grundlefleck

2
SSS'den alıntı yapmak için "Kendi programlama sorunuzu sormak ve cevaplamak da gayet güzel, ama Tehlikede olduğunuzu varsayın: bunu bir soru şeklinde ifade edin."
Craig Angus

17

Programlı olarak yapabilirsiniz:

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

Bu yaklaşım, daha sonra dosyayı belleğe eşlemek için özellikle yararlıdır .

dosyanın doğru boyutta olup olmadığını kontrol etmek için aşağıdaki komutu kullanın:

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

Dikkatli ol:

# du /tmp/foo.txt

dosya sisteminiz tarafından destekleniyorsa Sparse dosyası olarak ayrıldığından muhtemelen 0 yazdırır .

ayrıca bakınız: adam 2 açık ve adam 2 kesik


10

şunları yapabilirsiniz:

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

100 yerine, yazılmasını istediğiniz bayt sayısını yazın.


Ve gerçek dolum baytı da. "\ Xff" lazım ve iyi çalışıyor. Teşekkürler! :)
Ray

10

Bu yanıtlardan bazıları /dev/zeroverilerinizin kaynağı için kullanılır. Test ağınızın yükleme hızları, uygulamanız herhangi bir sıkıştırma yapıyorsa, bu en iyi fikir olmayabilir, sıfırlarla dolu bir dosya gerçekten iyi sıkıştırır . Dosyayı oluşturmak için bu komutu kullanma

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

upload_testYaklaşık 200 bayta kadar sıkıştırabilirim . Böylece kendinizi 10KB dosyası yüklediğinizi düşündüğünüz bir duruma sokabilirsiniz, ancak aslında çok daha az olurdu.

Ne önermek /dev/urandomyerine kullanmaktır /dev/zero. Çıktısını /dev/urandomçok fazla sıkıştıramadım .


Yerleşik sistemim yok /dev/zero, bu yüzden /dev/urandomiyi.
Fredrick Gauss

9
dd if=/dev/zero of=my_file.txt count=12345

4
Dd'nin varsayılan blok boyutunun 512 bayt olduğunu unutmayın, bu nedenle bu komut 12345 * 512 bayt boyutunda bir dosya oluşturur.
Kimse

4

Çok sayıda cevap var, ama hiçbiri başka neler yapılabileceğini güzelce açıklamadı. Dd için man sayfalarına bakıldığında , bir dosyanın boyutunu daha iyi belirlemek mümkündür.

Bu, 20 megabayt büyüklüğünde sıfırlarla dolu /tmp/zero_big_data_file.bin dosyasını oluşturacak:

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

Bu, 1000 bayt büyüklüğünde sıfırlarla dolu /tmp/zero_1000bytes_data_file.bin dosyasını oluşturacak:

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

veya

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

  • Tüm örneklerde, bs blok boyutu ve sayı blok sayısıdır
  • BLOKLARI ve BYTES'i şu çarpım ekleri izleyebilir: 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 vb. T, P, E, Z, Y için.


3

Bu, geçerli dizinde rasgele karakterler ve adı "4mb.txt" ile 4 MB metin dosyası oluşturur Farklı boyut ve adlar oluşturmak için parametreleri değiştirebilirsiniz.

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

0

Kullanım fallocatedisk beklemek istemiyorsanız.

Misal:

fallocate -l 100G BigFile

Kullanımı:

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
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.