Elimine o of=largerfile.txt
e anexe o stdout ao arquivo:
dd if=/dev/zero bs=1 count=262144 >> largerfile.txt
Eu tenho um arquivo que eu quero preencher até atingir 16 MiB (16777216 bytes). Atualmente é 16515072 bytes. A diferença é 262144 bytes.
Como faço para preenchê-lo?
Isso não parece estar funcionando:
cp smallfile.img largerfile.img
dd if=/dev/zero of=largerfile.img bs=1 count=262144
Além das respostas para obter um preenchimento físico, você também pode deixar a maior parte do espaço de preenchimento no arquivo apenas vazia ("furos"), por seek
ing para a nova posição final do arquivo e escrever um único caractere :
dd if=/dev/zero of=largerfile.txt bs=1 count=1 seek=16777215
(que tem a vantagem de ter muito mais desempenho, especificamente com bs=1
, e não ocupa grandes quantidades de espaço em disco adicional).
Esse método parece funcionar mesmo sem adicionar nenhum caractere, usando if=/dev/null
e o tamanho final do arquivo desejado:
dd if=/dev/null of=largerfile.txt bs=1 count=1 seek=16777216
Uma variante de desempenho de uma solução de preenchimento físico que usa tamanhos de bloco maiores é:
padding=262144 bs=32768 nblocks=$((padding/bs)) rest=$((padding%bs))
{
dd if=/dev/zero bs=$bs count=$nblocks
dd if=/dev/zero bs=$rest count=1
} 2>/dev/null >>largerfile.txt
A melhor resposta aqui é a de Janis (acima), pois permite que você esqueça o tamanho atual do arquivo e o coloque diretamente no tamanho desejado, sem nenhum cálculo.
Ele também tira vantagem de arquivos esparsos, o que não requer / dev / zero.
A resposta poderia ser mais clara, porque 'count' tem permissão para ser 0 e você ainda recebe o preenchimento:
dd if=/dev/null of=largerfile.txt bs=1 count=0 seek=16777216
(Edit: isto é correto para o GNU dd, mas o comportamento de count=0
é específico da plataforma, veja os comentários)
Você precisa usar dd
? Se você quiser que um arquivo tenha um comprimento (lógico) específico, apenas escreva um zero na posição desejada. Os bytes entre o final anterior e o byte escrito serão exibidos como tendo bytes nulos. Aqui está um exemplo usando perl.
$ echo Hello > file
$ ls -l file
-rw-r--r-- 1 user group 6 Apr 16 22:59 file
$ perl -le 'open(my $f,"+<","file"); seek($f, 16777216 - 2, 0); print $f "$ echo Hello > file
$ ls -l file
-rw-r--r-- 1 user group 6 Apr 16 22:59 file
$ perl -le 'open(my $f,"+<","file"); seek($f, 16777216 - 2, 0); print $f "%pre%"'
$ ls -ln file
-rw-r--r-- 1 user group 16777216 Apr 16 22:59 file
"'
$ ls -ln file
-rw-r--r-- 1 user group 16777216 Apr 16 22:59 file
Por que o "- 2" na linha? O script irá escrever um byte, então subtraímos 1 para buscar a posição antes daquele byte. Tiramos o outro porque a posição de busca é indexada em zero.
Tags dd