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

26

Eu tenho um script que grava em alguns arquivos, mas preciso deles 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)?

incognito2
fonte
1
Esta questão parece estar fora de tópico, porque se trata de programação, que pertence ao Stack Overflow .
Jenny D diz Reinstate Monica
Funciona oflag=appendpara você?
Mark K Cowan
Para esclarecer um comentário de @Mark K Cowan; ele quer dizer o ddcomando.
Alexander Pozdneev
Para sua informação, parece fallocateser outra opção para inserir furos em um arquivo. superuser.com/a/1172904/111432
akostadinov

Respostas:

41

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

 truncate -s +10 file.txt 
Pedra
fonte
2
É muito mais rápido porque gera um arquivo esparso, que é o que você deseja na maioria das vezes - mas se você não deseja um arquivo esparso, a abordagem dd funcionará.
derobert
34

Você pode tentar isso também

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

Isso será lido em / dev / zero e acrescentado ao seu arquivo NUMBER bytes.

Can Kavaklıoğlu
fonte
7

Abaixo está um exemplo de anexar 10 MB 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
Andrey Arapov
fonte
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 lidos anteriormente em / dev / zero.

Saudações,

Jeremy
fonte
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 mais facilmente:

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

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

A função lseek () deve permitir que o deslocamento do arquivo seja definido além do final dos dados existentes no arquivo. Se os dados forem posteriormente gravados nesse ponto, as leituras subsequentes dos dados no intervalo retornarão bytes com o valor 0 até que os dados sejam realmente gravados no intervalo.

Nesse caso, a 1ª chamada lseeke writepoderá 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, "\0", 1);
   lseek(nfd, atoi(args[2]) - 1, SEEK_SET);
   write(nfd, "\0", 1);
   close(nfd);
   return 0;
}
jfg956
fonte