Come posso aggiungere un numero specifico di byte null a un file? [chiuso]


26

Ho uno script che scrive in pochi file ma ho bisogno di loro di una dimensione specifica. Quindi mi chiedo se c'è un modo per aggiungere un numero specifico di byte null a un file utilizzando gli strumenti della riga di comando standard (ad esempio, copiando da /dev/zero)?


1
Questa domanda sembra fuori tema perché riguarda la programmazione, che appartiene allo StackTranslate.it .
Jenny D dice di reintegrare Monica il

Funziona oflag=appendper te?
Mark K Cowan,

Per chiarire un commento di @Mark K Cowan; intende il ddcomando.
Alexander Pozdneev,

FYI sembra che fallocatesia un'altra opzione per inserire buchi in un file. superuser.com/a/1172904/111432
akostadinov il

Risposte:


41

truncateè molto più veloce di dd. Per far crescere il file con 10 byte usare:

 truncate -s +10 file.txt 

2
È molto più veloce perché genererà un file sparse, che è quello che vuoi la maggior parte del tempo, ma se non vuoi un file sparse, l'approccio dd funzionerà.
derobert il

34

Puoi provare anche questo

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

Questo leggerà da / dev / zero e aggiungerà al tuo file NUMBER byte.


7

Di seguito è riportato un esempio di aggiunta di 10 MB a un file utilizzando solo dd.

[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

la mia prima ipotesi sarebbe:

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

Fondamentalmente, questo comando dice a dd di "andare" alla fine del file e aggiungere alcuni byte precedentemente letti da / dev / zero.

Saluti,


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

o

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

e per calcolare le dimensioni più facilmente:

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

0

Se stai riempiendo il tuo file di byte null, suppongo che tu stia manipolando il file in a char *in C. In questo caso, potresti non aver bisogno di riempire il file con byte null, aggiungendo solo un byte null alla fine del file e quindi riempirlo con byte casuali potrebbe essere sufficiente. In questo caso, il muggito del programma C sarebbe molto efficiente (da usare solo su file più piccoli del secondo parametro, altrimenti i dati verrebbero sovrascritti). Potrebbe anche fare quello che vuoi (riempimento con byte null) poiché la lseekdefinizione della funzione afferma che:

La funzione lseek () consente di impostare l'offset del file oltre la fine dei dati esistenti nel file. Se i dati vengono successivamente scritti a questo punto, le successive letture dei dati nello spazio devono restituire byte con il valore 0 fino a quando i dati non vengono effettivamente scritti nello spazio.

In questo caso, la prima chiamata a lseeke writepotrebbe essere rimossa. Ma i test dovrebbero essere fatti sul tuo sistema 1 ° ...

#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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.