Homem dd
:
dd - converte e copia um arquivo
Estou inclinado a usar dd
. Estranhamente, depois de copiar o arquivo de texto de 1 byte, fica muito menor:
$ block_size=1; device_to_edit=/media/ramdrive/a; device_from=/media/ramdrive/b; echo "aaaaaaaaaa">$device_to_edit; echo "bbbbbbbbbb">$device_from; cat $device_to_edit; cat $device_from; dd if=$device_from of=$device_to_edit count=1 seek=2 skip=2 bs=$block_size; cat $device_to_edit
aaaaaaaaaa
bbbbbbbbbb
1+0 records in
1+0 records out
1 byte copied, 0,000156688 s, 6,4 kB/s
aab
Ele disse 1 byte copied
, por que o fim do arquivo desapareceu?
Adicionado:
Como comentário sugerido, conv=notrunc
corrige. Mas de man
:
conv=CONVS converte o arquivo de acordo com a lista de símbolos separados por vírgulas
Eu não queria converter um arquivo. Ao ler sobre copiar dispositivos de bloco, não vi este operando. É sempre necessário quando nem todos os arquivos (por exemplo, um bloco de 512 bytes em /dev/sdb: disco USB) são alterados?
O que você está fazendo é isso:
você está pedindo
dd
para copiar apenas um byte. Mas, por padrão, ele trunca o arquivo de saída, de modo que o final do arquivo seja ondedd
terminou.A página de manual do GNU que tenho não parece dizer isso explicitamente, mas a descrição do POSIX diz :
Para evitar isso, adicione a
conv=notrunc
opção:notrunc
não faz com que ele modifique os dados que realmente são copiados, portanto, não é uma "conversão" nesse sentido, mesmo que seja um sinalizador paraconv
.Observe que if
count=
é fornecido,dd
faz exatamente essa quantidaderead()
de chamadas, o que significa que, se você ler de um dispositivo que pode fornecer leituras curtas, a quantidade de dados realmente lidos não écount
timesbs
.Deveria ter olhado a documentação completa,
man dd
: