dd
foi projetado para copiar blocos de dados de um arquivo de entrada para um arquivo de saída. As opções de tamanho do bloco dd
são as seguintes, na página do manual :
ibs=expr
Specify the input block size, in bytes, by expr (default is 512).
obs=expr
Specify the output block size, in bytes, by expr (default is 512).
bs=expr
Set both input and output block sizes to expr bytes, superseding ibs= and obs=.
A opção dd
seek
é semelhante à chamada do sistema UNIX lseek()
1 . Move o ponteiro de leitura / gravação dentro do arquivo. Na página de manual :
seek=n
Skip n blocks (using the specified output block size) from the beginning of the output file before copying.
Arquivos comuns no UNIX possuem a propriedade conveniente que você não precisa ler ou escrever no início; você pode procurar em qualquer lugar e ler ou escrever a partir daí. Então, bs=4096 seek=7
significa mover para uma posição 7 * 4096 bytes a partir do início do arquivo de saída e começar a escrever a partir daí. Ele não grava na parte do arquivo que está entre 0 e 7 * 4096 bytes.
Áreas de arquivos comuns que nunca são gravados de forma alguma são alocadas pelo sistema de arquivos subjacente. Essas áreas são chamadas de holes e os arquivos são chamados de arquivos esparsos . No seu exemplo, file_with_holes
terá um buraco de 7 * 4096 bytes no início. (h / t @frostschutz por apontar que dd
trunca o arquivo de saída por padrão).
Não há problema em ler essas áreas não alocadas; você recebe um monte de zeros.
[1] quando dd
foi escrito, a chamada de sistema análoga era seek()
.