Bir dosyaya belirli sayıda boş bayt ekleyebilir miyim? [kapalı]


26

Birkaç dosyaya yazan bir betiğim var ama onlara belirli bir boyuta ihtiyacım var. Bu yüzden standart komut satırı araçlarını (örneğin, kopyalayarak /dev/zero) kullanarak bir dosyaya belirli sayıda boş bayt eklemenin bir yolu olup olmadığını merak ediyorum.


1
Bu soru konu dışı gibi görünüyor çünkü yığın taşması ile ilgili olan programlama ile ilgili .
Jenny D, Reinstate Monica’nın

Sizin için oflag=appendçalışıyor mu
Mark K Cowan,

Bir yorumu @Mark K Cowan; o ddemir demek .
Alexander Pozdneev

FYI gibi görünüyor fallocatebir dosyaya delik eklemek için başka bir seçenek. superuser.com/a/1172904/111432
akostadinov

Yanıtlar:


41

truncatedaha hızlı dd. Dosyayı 10 bayt ile büyütmek için şunu kullanın:

 truncate -s +10 file.txt 

2
Çok daha hızlı, çünkü çoğu zaman istediğiniz şey olan seyrek bir dosya oluşturacak; ancak seyrek bir dosya istemiyorsanız, dd yaklaşımı çalışacaktır.
derobert

34

Bunu da deneyebilirsin

dd if=/dev/zero bs=1 count=NUMBER >> yourfile

Bu, / dev / zero'dan okuyacak ve dosya NUMBER baytınıza ekleyecektir.


7

Aşağıda sadece dd kullanarak bir dosyaya 10 MB ekleme örneğidir.

[root@rhel ~]# cp /etc/motd ./test
[root@rhel ~]# hexdump -C test |tail -5
000003e0  0a 0a 3d 3d 3d 3d 3e 20  54 65 78 74 20 6f 66 20  |..====> Text of |
000003f0  74 68 69 73 20 6d 65 73  73 61 67 65 20 69 73 20  |this message is |
00000400  69 6e 20 2f 65 74 63 2f  6d 6f 74 64 20 3c 3d 3d  |in /etc/motd <==|
00000410  3d 3d 0a                                          |==.|
00000413

[root@rhel ~]# dd if=/dev/zero of=/root/test ibs=1M count=10 obs=1M oflag=append conv=notrunc
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0208541 s, 503 MB/s

[root@rhel ~]# hexdump -C test |tail -5
00000410  3d 3d 0a 00 00 00 00 00  00 00 00 00 00 00 00 00  |==..............|
00000420  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00a00410  00 00 00                                          |...|
00a00413

5

ilk tahminim şöyle olurdu:

dd if=/dev/zero of=myfile bs=1 count=nb_of_bytes seek=$(stat -c%s myfile)

Temel olarak, bu komut dd'ye dosyanın sonunda "git" i bildirir ve / dev / zero'dan daha önce okunan bazı baytları ekler.

Saygılarımızla,


2
cat "your file" /dev/zero | head -c "total number of bytes"

veya

head -c "number of bytes to add" /dev/zero >> "your_file"

ve boyutu daha kolay hesaplamak için:

head -c $(( "total number of bytes" - $(stat -c "%s" "your_file") )) /dev/zero >> "your_file"

0

Dosyanızı boş baytlarla dolduruyorsanız, benim tahminim, dosyayı bir char *C'de değiştirdiğinizdir. Bu durumda, dosyayı boş baytlarla doldurmanız gerekmeyebilir, sadece sonunda boş bir bayt eklenmesi gerekmeyebilir. Dosyanın ve ardından rastgele bayt ile doldurma yeterli olabilir. Bu durumda, C programı fermanı çok verimli olacaktır (sadece 2. parametreden daha küçük dosyalarda kullanılacak, aksi halde verinin üzerine yazılacaktır). lseekİşlev tanımının belirttiği gibi, istediğinizi yapabilir (boş baytla doldurma) :

Lseek () işlevi, dosya ofsetinin dosyada mevcut verinin sonunun ötesinde ayarlanmasına izin verir. Veriler daha sonra bu noktada yazılırsa, boşluktaki daha sonraki veri okumaları, veriler gerçekte boşluğa yazılana kadar 0 değeri ile bayt döndürür.

Bu durumda 1. çağrı lseekve writekaldırılabilir. Ancak sisteminizde 1. testler yapılmalı ...

#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

/* 1st parameter: a file name, 2nd parameter: a file size. */
int main(int argc, char ** args) {
   int nfd = open(args[1], O_WRONLY);
   lseek(nfd, 0, SEEK_END);
   write(nfd, "\0", 1);
   lseek(nfd, atoi(args[2]) - 1, SEEK_SET);
   write(nfd, "\0", 1);
   close(nfd);
   return 0;
}
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.