Sem um buffer, você poderia voltar para trás, um bloco de cada vez.
for i in $(seq 100 -1 0)
do
dd if=/dev/thing of=/dev/thing \
bs=1M skip=$i seek=$(($i+2)) count=1
done
Por favor, note que este exemplo é perigoso devido à falta de verificação de erros.
Também é lento devido à quantidade de dd
de chamadas. Se você tem memória de sobra, você poderia usar um tamanho maior de blocos.
Com um buffer, cuidado com armadilhas . Não é suficiente para garantir um pré-enchimento de 100%. O que você precisa é de um preenchimento mínimo durante todo o processo. O buffer nunca deve cair abaixo de 2M
, porque senão você terá sobrescrito seus dados ainda a serem lidos novamente.
Então, em teoria, você poderia fazer sem qualquer tipo de buffer e apenas cadeia dd
:
dd if=/dev/thing bs=1M | \
dd bs=1M iflag=fullblock | \
dd bs=1M iflag=fullblock | \
dd of=/dev/thing bs=1M seek=2
Na prática, isso não funciona de forma confiável porque não há garantia de que o primeiro dd
consiga manter os dados de leitura, enquanto o último dd
(com 2M
de "buffer" entre ) já está escrevendo.
Você pode aumentar consideravelmente suas chances, tornando o entre-buffer consideravelmente maior, mas, mesmo assim, não é confiável.
Infelizmente, não conheço um bom programa de buffer com uma propriedade mínima de preenchimento. Você precisa de um que interrompa a saída, desde que haja menos do que a margem de segurança dentro do buffer.