Como preencher um arquivo para um tamanho desejado?

13

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
    
por tarabyte 17.04.2015 / 00:04

4 respostas

6

Elimine o of=largerfile.txt e anexe o stdout ao arquivo:

dd if=/dev/zero bs=1 count=262144 >> largerfile.txt
    
por 17.04.2015 / 00:13
10

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
    
por 17.04.2015 / 00:59
4

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)

    
por 17.04.2015 / 11:21
1

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.

    
por 17.04.2015 / 08:06

Tags