O dd pode sobrescrever partes de um arquivo? [duplicado]

26

Eu tenho um arquivo grande de 1 TB (imagem de disco de uma unidade danificada) e um arquivo pequeno de 1,3 MB (início de um arquivo de disco).

Usando o conteúdo do arquivo pequeno, quero sobrescrever partes do arquivo grande. Quer dizer, eu quero inserir / sobrescrever os primeiros 1.3MB da imagem de 1TB usando o arquivo pequeno.

Usando pequenos arquivos temporários para teste, não pude sobrescrever partes dos arquivos. Em vez disso, o dd sobrescreveu os arquivos completamente. Não é isso que eu quero.

O dd é capaz de fazer isso?

    
por bos 28.07.2014 / 07:55

4 respostas

33

Se você usar o argumento conv=notrunc , poderá substituir apenas os primeiros quantos bytes.
por exemplo. dd conv=notrunc if=small.img of=large.img

root@debian:~/ddtest# dd if=/dev/zero of=file1.img bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 1.14556 s, 9.2 MB/s
root@debian:~/ddtest# dd if=/dev/urandom of=file2.img bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.207185 s, 5.1 MB/s
root@debian:~/ddtest# head file1.img 

<< Blank space here as it's all Zeroes >>

root@debian:~/ddtest# dd conv=notrunc if=file2.img of=file1.img 
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB) copied, 0.00468016 s, 224 MB/s
root@debian:~/ddtest# head file1.img 
^�v�y�ے!� E�91����  << SNIP Random garbage >>
root@debian:~/ddtest# 
    
por 28.07.2014 / 08:02
18

Se você deseja substituir apenas no início do arquivo e deixar o restante intacto, use o conv=notrunc para evitar o truncamento:

dd conv=notrunc if=/dev/zero of=test bs=1024 count=1024

notrunc significa :

Do not truncate the output file. Preserve blocks in the output file not explicitly written by this invocation of the dd utility.

Ele está em POSIX e é suportado por todas as versões de dd .

    
por 28.07.2014 / 08:02
3

Se você quiser sobrescrever o start de big-file com o conteúdo de small-file sem afetar o restante, você pode fazer apenas com qualquer shell parecido com o Bourne:

cat small-file 1<> big-file

O operador de redirecionamento <> abre o arquivo no modo de leitura + gravação sem truncamento. Isso seria equivalente a usar dd do conv=notrunc , mas sem todos os problemas e limitações de dd .

Se você quiser escrever o conteúdo em qualquer lugar do que no início do arquivo, será necessário procurar a posição desejada no arquivo. É aí que dd e seu seek=xxx são úteis, mas você também pode usar um shell que tenha operadores de busca integrados como ksh93 ou zsh :

cat small-file 1<> big-file >#((12345)) # ksh93

zmodload zsh/system; {sysseek -u1 12345 && cat small-file} 1<> big-file # zsh
    
por 24.05.2016 / 17:11
3

Exemplo:

printf '\xa1' | dd conv=notrunc of=Yourfile bs=1 seek=$((0xoffset))
    
por 24.05.2016 / 16:07

Tags