Tenha em mente que dd
é uma interface de cru para a read()
, write()
e lseek()
chamada de sistema. Você pode usá-lo apenas com confiabilidade para extrair blocos de dados de arquivos regulares, dispositivos de bloco e alguns dispositivos de caracteres (como /dev/urandom
), ou seja, arquivos para os quais read(buf, size)
é garantido que retorne size
enquanto o final do arquivo não for atingido.
Para tubos, soquetes e a maioria dos dispositivos de caracteres (como ttys), você não tem essa garantia, a menos que faça read()
s do tamanho 1 ou use a dd
extensão GNU iflag=fullblock
.
Então:
{
gdd < file1 bs=1M iflag=fullblock count=99 skip=1
gdd < file2 bs=1M iflag=fullblock count=10
} > final_output
Ou:
M=1048576
{
dd < file1 bs=1 count="$((99*M))" skip="$M"
dd < file2 bs=1 count="$((10*M))"
} > final_output
Ou com conchas com suporte embutido para um operador de busca como ksh93
:
M=1048576
{
command /opt/ast/bin/head -c "$((99*M))" < file1 <#((M))
command /opt/ast/bin/head -c "$((10*M))" < file2
}
Ou zsh
(supondo que você head
suporte a -c
opção aqui):
zmodload zsh/system &&
{
sysseek 1048576 && head -c 99M &&
head -c 10M < file2
} < file1 > final_output
oflag=append conv=notrunc
), portanto, os sistemas de arquivos que fazem alocação atrasada (como o XFS) são menos propensos a decidir que o arquivo está sendo gravado quando ainda há mais.