Crie um arquivo de teste com muitos zero bytes

25

Eu sei como criar um arquivo vazio:

touch /var/tmp/nullbytes

mas como posso criar um arquivo de 1 MB que contenha apenas bytes nulos na linha de comando com bash?

rubo77
fonte
Relaciona a pergunta SU: superuser.com/q/609020/151431
terdon
11
+1. Pergunta interessante. Alguém poderia elaborar gentilmente em quais cenários esse arquivo seria necessário?
Kent Pawar
11
Eu precisava dele para simular um acidente na chkrootkit: unix.stackexchange.com/questions/86866/...
rubo77

Respostas:

56

Com o GNU truncate:

truncate -s 1M nullbytes

(supondo nullbytesque não existisse anteriormente) criaria um arquivo esparso de 1 mebibyte. Esse é um arquivo que aparece preenchido com zeros, mas que não ocupa espaço no disco.

Sem truncate, você pode usar dd:

dd bs=1048576 seek=1 of=nullbytes count=0

(com algumas ddimplementações, você pode substituir 1048576 por 1M)

Se você preferir que o espaço em disco seja alocado , no Linux e em alguns sistemas de arquivos, você pode:

fallocate -l 1M nullbytes

Isso aloca o espaço sem realmente gravar dados no disco (o espaço é reservado, mas marcado como não inicializado).

dd < /dev/zero bs=1048576 count=1 > nullbytes

Na verdade, escreverá os zeros no disco. Essa é a menos eficiente, mas se você precisar que suas unidades girem ao acessar esse arquivo, é para isso que você deve procurar.

Ou a maneira do @ mikeserv de enganar ddpara gerar os bytes NUL:

dd bs=1048576 count=1 conv=sync,noerror 0> /dev/null > nullbytes

Uma alternativa ao GNU headque não envolve a necessidade de especificar um tamanho de bloco (1M é OK, mas 10G, por exemplo, não):

head -c 1M < /dev/zero > nullbytes

Ou para obter uma barra de progresso:

pv -Ss 1M < /dev/zero > nullbytes
Stéphane Chazelas
fonte
Não use truncatepara criar um arquivo vazio para ser usado como volume de troca ... isso não funcionará! Use ddneste caso.
Elias Probst
11
@EliasProbst, cópia ITYM de / dev / zero , não use um arquivo esparso . ddpode criar arquivos esparsos como mostrei também.
Stéphane Chazelas
2
fallocate é a melhor e rápido maneira de criar porque se reserva o espaço e fazê-lo rápido, mas ele não se preocupou em escrever nada ( stackoverflow.com/questions/257844/... )
curratore
... ou bs=1kx1k. Ou <&1 dd bs=1kx1k conv=sync,noerror count="$rpt" | cat >filepara a coisa literal de gravação em disco. Não é 100% sobre quanta eficiência pode ser perdida ao forçar o erro de leitura.
mikeserv
27
dd if=/dev/zero of=/var/tmp/nullbytes count=1 bs=1M
Zelda
fonte