Como eu adiciono um número específico de bytes nulos a um arquivo? [fechadas]

24

Eu tenho um script que escreve em alguns arquivos, mas eu preciso de um tamanho específico. Então, eu estou querendo saber se há uma maneira de anexar um número específico de bytes nulos a um arquivo usando ferramentas de linha de comando padrão (por exemplo, copiando de /dev/zero )?

    
por incognito2 23.12.2011 / 10:18

6 respostas

40

truncate é muito mais rápido que dd . Para aumentar o arquivo com 10 bytes, use:

 truncate -s +10 file.txt 
    
por 23.12.2011 / 11:56
34

Você também pode tentar isso

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

Isto irá ler / dev / zero e anexar aos seus NUMBER bytes do arquivo.

    
por 23.12.2011 / 10:36
7

Abaixo está um exemplo de acrescentar 10MB a um arquivo usando apenas 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
    
por 29.10.2013 / 09:22
5

meu primeiro palpite seria:

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

Basicamente, este comando diz ao dd para "ir" no final do arquivo e adicionar alguns bytes previamente lidos de / dev / zero.

Atenciosamente,

    
por 23.12.2011 / 10:31
2
cat "your file" /dev/zero | head -c "total number of bytes"

ou

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

e para calcular o tamanho com mais facilidade:

head -c $(( "total number of bytes" - $(stat -c "%s" "your_file") )) /dev/zero >> "your_file"
    
por 31.12.2011 / 18:45
0

Se você estiver preenchendo seu arquivo com bytes nulos, meu palpite é que você está manipulando o arquivo em char * in C. Se esse for o caso, talvez você não precise preencher o arquivo com bytes nulos, apenas adicionando um byte nulo no final do arquivo e preenchê-lo com bytes aleatórios pode ser suficiente. Neste caso, o programa C abaixo seria muito eficiente (para ser usado somente em arquivos menores que o segundo parâmetro, caso contrário os dados seriam sobrescritos). Pode até fazer o que você deseja (preenchimento com bytes nulos), pois a definição da função lseek declara que:

The lseek() function shall allow the file offset to be set beyond the end of the existing data in the file. If data is later written at this point, subsequent reads of data in the gap shall return bytes with the value 0 until data is actually written into the gap.

Nesse caso, a primeira chamada para lseek e write poderia ser removida. Mas os testes devem ser feitos no seu sistema primeiro ...

#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, "
#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, "%pre%", 1);
   lseek(nfd, atoi(args[2]) - 1, SEEK_SET);
   write(nfd, "%pre%", 1);
   close(nfd);
   return 0;
}
", 1); lseek(nfd, atoi(args[2]) - 1, SEEK_SET); write(nfd, "%pre%", 1); close(nfd); return 0; }
    
por 01.01.2012 / 14:17

Tags