Soru Bir dosyaya belirli bir sayıda null bayt eklerim? [kapalı]


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


24
2017-12-23 09:18


Menşei


Bu soru konu dışı gibi görünmektedir, çünkü bu programa aittir. Yığın Taşması. - Jenny D
does oflag=append Senin için mi çalışıyorsun? - Mark K Cowan
@Mark K Cowan tarafından yapılan bir yorumu netleştirmek için; o demek dd Komut. - Alexander Pozdneev


Cevaplar:


truncate daha hızlı dd. Dosyayı 10 baytlık bir şekilde kullanmak için şunları kullanın:

 truncate -s +10 file.txt 

39
2017-12-23 10:56



Daha hızlıdır çünkü seyrek bir dosya oluşturur, bu çoğu zaman istediğiniz şeydir - ancak seyrek bir dosya istemiyorsanız dd yaklaşımı çalışır. - derobert


Bunu da deneyebilirsiniz

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

Bu / dev / zero değerinden okunacak ve dosyanızın NUMBER baytına eklenecektir.


33
2017-12-23 09:36





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

[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

7
2017-10-29 08:22





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 sonuna "git" ve daha önce / dev / sıfır'dan okunan bazı baytlar eklemesini söyler.

Saygılarımızla,


5
2017-12-23 09:31





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"

2
2017-12-31 17:45





Dosyanızı boş bayt ile doldurursanız, tahminim dosyayı bir char * Bu durumda, dosyayı null bayt ile doldurmanız gerekmeyebilir, yalnızca dosyanın sonuna boş bir bayt eklenir ve ardından rasgele baytlarla doldurulabilir. Bu durumda, C programı körüğü çok verimli olacaktır (sadece 2. parametreden daha küçük dosyalarda kullanılmak üzere, aksi takdirde verilerin üzerine yazılacaktır). İstediğinizi bile yapabilir (boş bayt ile doldurma) lseek işlev tanımı şunları belirtir:

Lseek () işlevi, dosya ofsetinin ötesine ayarlanmasını sağlar.   dosyadaki mevcut verilerin sonu. Eğer daha sonra veriler yazılırsa   nokta, aradaki verilerin sonraki okumaları bayt ile   0 değeri aslında veri boşluklarına yazılana kadar.

Bu durumda, 1. çağrı lseek ve write kaldırılmış olabilir. Ama testler sisteminizde 1 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;
}

0
2018-01-01 13:17